【问题标题】:Circular prime, help finding the mistake, C++圆形素数,帮助查找错误,C++
【发布时间】:2012-11-21 18:10:05
【问题描述】:

花了一个小时试图找出一个错误,但没有成功:(
解决欧拉问题: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;
}

提前谢谢你!

【问题讨论】:

  • 尝试将您的代码缩小到您认为出错的功能,大多数人不会阅读您的整个代码。
  • 是的,我知道。但我重新检查了每个功能。如果我不是那么绝望,我永远不会在这里发帖:(但是谢谢你的回答
  • 问题是你的代码有多长,在每个函数中添加小的 cout 语句来观察它在做什么。这是一项乏味的工作,但它有助于调试您的程序
  • 欧拉项目中的问题大部分时间都包含较小问题空间的解决方案(对于您的问题,它列出了直到 100 的圆素数)。您的代码是否适用于这种简单的情况?如果不是,请检查返回的数字。如果有错误的数字,请使用调试器找出在这些情况下会发生什么。如果有一些遗漏,调试这些会发生什么。
  • 表明您的问题已解决的方式是接受答案,而不是更新您的问题及其标题。如果现有答案都不能解决您的问题,请随时发布您自己问题的答案并接受它。

标签: c++ primes


【解决方案1】:

这个问题在SO上已经解决了很多次了。搜索“[c++] 素数欧拉”。

证据由for循环的终止条件给出:

sqrt(upper_bound - lower_bound)

我在您的帖子中找不到primes[] 的定义。 range 函数访问它,但它不是通过参数提供的,也不是在函数中声明的 primes 数组。

您可以通过搜索 SO 和网络获取大量信息。在发布之前尝试一下。

【讨论】:

  • 是的,我知道在哪里可以找到正确的解决方案,我也知道如何以其他可行的方式解决任务。问题是为什么这段代码不起作用,因为对我来说一切都很好。 lower_bound 什么都不做,我还没有完成代码。 primes[] 是一个向量。我粘贴了类方法,所以代码不是很大很长
  • @AleksandrBelkin 要求审核您的特定代码的地方是Code Review
  • @WillNess 谢谢,不知道!下次会在那儿发帖
  • 在 1 年内可能不会出现“多次 SO”。请始终尝试提供一些资源,当我进入论坛时,我个人感到非常沮丧,我读到的第一件事就是“在其他地方搜索”
  • @Default:正如我所说,欧拉素数帖子太多了。我使用了谷歌,“stackoverflow euler prime numbers”,这就是我得到的:google.com/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 2011-08-21
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
相关资源
最近更新 更多