我正在尝试解决Project Euler problem 10,其中要求用户计算所有素数小于200万的总和。我通过研究pseudocode on Wikipedia写了以下内容,但它产生的答案似乎是不正确的,至少根据网站的说法,每当我尝试输入它时:
int main()
{
int limit = 2000000;
int answer = 5;
std::vector<bool> isPrime;
for( int i = 0; i < limit; ++i ){
isPrime.push_back( false );
}
int n = 0;
for( int x = 1; x <= ceil( sqrt( limit ) ); ++x ){
for( int y = 1; y <= ceil( sqrt( limit ) ); ++y ){
n = 4*x*x + y*y;
if( (n <= limit) && ( n%12 == 1 || n%12 == 5 ) ){
isPrime.at(n) = ! isPrime.at(n);
}
n = 3*x*x + y*y;
if( (n <= limit) && ( n%12 == 7 ) ){
isPrime.at(n) = ! isPrime.at(n);
}
n = 3*x*x - y*y;
if( (x > y) && (n <= limit) && (n%12 == 11) ){
isPrime.at(n) = ! isPrime.at(n);
}
}
}
for( n = 6; n <= ceil( sqrt( limit ) ); n += 2 ){
if( isPrime.at(n) ){
for( int m = n*n; m < limit; m += n*n ){
isPrime.at(m) = false;
}
}
}
for( int i = 5; i < limit; i += 2 ){
if( isPrime.at(i) ){
answer += i;
}
}
std::cout << "The sum of the primes below " << limit << " is " << answer << std::endl;
return 0;
}
生成以下输出:
The sum of all the primes below 2000000 is 1179908154
我已经用较小的限制对其进行了测试,我可以手动验证并且代码确实对这些数字正确运行。我发现其他人的实现表明答案应该是142913828922
,但我无法弄清楚他们的代码与我的不同之处。
任何人都可以看到我在这里做错了吗?
答案 0 :(得分:8)
答案只有一个带符号的32位整数。实际答案是多高于32位,所以你必须转到使用64位整数。请尝试使用unsigned long long
。
答案 1 :(得分:-1)
您可以创建自己的类来存储大数字。或者您可以使用整数数组来存储答案并在每个索引处存储每个数字。 (即使无符号长期不工作):)