我的代码如下。它的工作完美而间隔不是很大。但是每当我超过一百万时,程序就会停止。例如,对于区间2到2000000,素数之和应该是142913828922(从书的后面),而我的应用程序显示1179908154.有人可以指出我哪里出错了。
#include <iostream>
#include <math.h>
#define BELOW 2000000;
using namespace std;
bool isPrime(int num)
{
int i;
for (i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
return 0;
}
else {
;
}
}
}
int main()
{
long sum = 0;
for (int i = 2; i < BELOW i++) {
if (isPrime(i)) {
sum = sum + i;
printf("sum: %ld\n", sum);
}
}
cin.get();
return 0;
}
答案 0 :(得分:4)
您正在处理的问题是integer overflow。
大多数计算机上的 (signed) long
可以包含-2147483647
和2147483647
之间的值。
你应该使用更大的数据类型,我建议unsigned long long
,在大多数机器上,它可以保存:0
到18446744073709551615
之间的值(至少64位)或{ {1}}输入。
答案 1 :(得分:1)
您应该使用'uint64_t'
替换所有出现的'int'和'long'