我已经用 C++ 编写了一个 Eratosthenes 算法的筛子,它适用于我测试过的较小的数字。但是,当我使用大数字,即 2 000 000 作为上限时,程序开始给出错误的答案。谁能澄清为什么?
感谢您的帮助。
#include <iostream>
#include <time.h>
using namespace std;
int main() {
clock_t a, b;
a = clock();
int n = 0, k = 2000000; // n = Sum of primes, k = Upper limit
bool r[k - 2]; // r = All numbers below k and above 1 (if true, it has been marked as a non-prime)
for(int i = 0; i < k - 2; i++) // Check all numbers
if(!r[i]) { // If it hasn't been marked as a non-prime yet ...
n += i + 2; // Add the prime to the total sum (+2 because of the shift - index 0 is 2, index 1 is 3, etc.)
for(int j = 2 * i + 2; j < k - 2; j += i + 2) // Go through all multiples of the prime under the limit
r[j] = true; // Mark the multiple as a non-prime
}
b = clock();
cout << "Final Result: " << n << endl;
cout << b - a << "ms runtime achieved." << endl;
return 0;
}
编辑:我刚刚进行了一些调试,发现它可以在 400 左右的限制下工作。但是,在 500 时,它关闭了 - 它应该是 21536,但是是 21499
编辑2:啊,我发现了两个错误,这些似乎已经解决了问题。
第一个是由其他回答的人发现的,并且 n 溢出 - 在被设为 long long 数据类型后,它已经开始工作。
第二个相当值得大惊小怪的错误是 r 中的布尔值必须被初始化。在检查素数以使它们全部为假之前运行循环之后,得到正确的答案。有谁知道为什么会这样?