簡體   English   中英

循環素數,幫助發現錯誤,C ++

[英]Circular prime, help finding the mistake, C++

花了一個小時試圖找到一個錯誤,沒有成功:(
解決歐拉問題: http : //projecteuler.net/problem=35
似乎我的頭此刻不在工作

代碼未優化,對此感到抱歉(我在這里做什么錯了?)正確的答案是55,我的程序給了我22

#include "euler.hpp"
#include <algorithm>

int main() {
    euler::prime_generator<euler::eratosthenes_sieve> gen;
    gen.range(0, 1000000);
    unsigned c = 0; // number of circular primes
    unsigned p = 0; // number of primes (test)
    unsigned prime;
    while(prime = gen.nextPrime()) {
        p++;
        bool ok = true;
        std::vector<unsigned> pv = euler::number2vector(prime);
        if(pv.size() > 1) {

            bool cont = false;
            for(unsigned i = 0; i < pv.size(); ++i) {
                if(pv[i] % 2 == 0) { cont = true; break; }
            }
            if(cont) continue;
            std::sort(pv.begin(), pv.end());

            do {
                if(!gen.isPrime(euler::array2number(&pv[0], pv.size()))) {
                    // was desperate and made this
                    if(euler::isPrime(euler::array2number(&pv[0], pv.size()))) {
                        std::cout << prime << " -> " << euler::array2number(&pv[0], pv.size()) << std::endl;
                    }
                    else ok = false;
                    break;
                }
            } while(std::next_permutation(pv.begin(), pv.end()));

        }
        if(ok) {
            //std::cout << prime << std::endl;
            c++;
        }
        //std::cout << prime << std::endl;
    }

    std::cout << p << " -> " << c << std::endl;

    euler::pause();
}

我使用的幾個外部功能

// in class
void range(unsigned lower_bound, unsigned upper_bound) {
    m_lower_bound = lower_bound;
    primes.resize(upper_bound - lower_bound + 1, true);
    for(unsigned i = 0; i < 2 - lower_bound; ++i) primes[i] = false;
    for(unsigned i = 2; i <= sqrt(upper_bound - lower_bound); ++i) {
        if(primes[i]) {
            for(unsigned j = i*i; j <= upper_bound; j += i) {
                primes[j] = false;
            }
        }
    }
}
// in the same class
bool isPrime(unsigned number) {
    return primes[number - m_lower_bound];
}

// in the same class
unsigned nextPrime() {
    for(; next <= m_upper_bound; ++next) {
        if(isPrime(next)) return next++ + m_lower_bound;
    }
    return 0;
}

template <typename T>
T array2number(T * begin, unsigned length) {
    T number = 0;
    unsigned m = 1;
    while(length--) {
        number += begin[length] * m;
        m *= 10;
    }
    return number;
}

template <typename T>
std::vector<T> number2vector(T number) {
    unsigned l = number_length(number);
    std::vector<T> vec(l);
    while(l--) {
        vec[l] = number % 10;
        number /= 10;
    }
    return vec;
}

先感謝您!

這個問題已經在SO上解決了很多次。 搜索“ [c ++]原歐拉”。

for循環的終止條件給出了證據:

sqrt(upper_bound - lower_bound)

我在您的帖子中找不到primes[]的定義。 range函數可以訪問它,但是它不是通過參數提供的,也不是在函數中聲明的primes數組。

通過搜索SO和網絡,您可以獲得很多信息。 在發布之前嘗試一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM