大家好,我正在制定一项计划,将所有素数的总和低于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;
}
答案 0 :(得分:8)
我能找到的唯一逻辑错误是你永远不会在循环中将isPrime
重新设置为true
,但这不应该导致无限循环,只是错误的结果。
我怀疑它是无限循环,我只是认为它需要很长时间,因为它是次优的。在i
,sqrt(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。