C ++中素数的总和

时间:2013-01-04 22:05:07

标签: c++ primes

大家好,我正在制定一项计划,将所有素数的总和低于200万。这就是我所拥有的...我知道这个方法适用于寻找素数,因为我之前已经使用过它...但是当我运行这个程序时,我不断得到一个无限循环而没有输出......任何帮助都会很大理解!

#include <iostream>
using namespace std;

int main (int argc, char * const argv[]) {
    bool isPrime=true;
    int i = 2;
    int sum = 0;
    do{

        for ( int j = 2; j < i; j++)
        {
            if ( i % j == 0 )
            {
                isPrime=false;
                break;
            }
        }
        if (isPrime)
        {
            cout << "Prime: " << i << endl;
            sum += i; // add prime number to sum
        }
        i++;

    }while(i < 2000000);

    cout << "the sum of all the primes below two million is: " << sum << endl;
    getchar();
    return 0;
}

3 个答案:

答案 0 :(得分:8)

我能找到的唯一逻辑错误是你永远不会在循环中将isPrime重新设置为true,但这不应该导致无限循环,只是错误的结果。

我怀疑它是无限循环,我只是认为它需要很长时间,因为它是次优的。在isqrt(i)甚至i/2之前,您无需检查每个号码。

更好的是,你可以生成一个素数的筛子(谷歌这个),然后加上它们 - 这将更加有效。

答案 1 :(得分:4)

我认为你没有无限循环。您忘了将isPrime设置为true,正如Luchian Grigore所说,但您的代码也需要很长时间才能运行。请注意,您可以在j*j > i之后停止进行试验。

答案 2 :(得分:0)

如果你也担心用最少的努力提高效率 - 获得素数你只需要检查表格的数字(6n + 1)和(6n + 5)

所以包括你的主循环中的内容:

int p6 = p % 6;
if (p6 == 1) {
    result = isPrime(p);
    p += 4;
} else if (p6 == 5) {
    result = isPrime(p):
    p += 2;
}

会加倍你的倍数。不要忘记角落案例2和3。