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: ああ、2 つのエラーが見つかりましたが、それらは問題を解決したようです。
1 つ目は、他の回答者が発見したもので、n がオーバーフローしているというものです。long long データ型にすると、機能し始めました。
2 番目の間違いは、r のブール値を初期化する必要があったことです。素数をチェックする前に loop を実行してすべての素数を false にすると、正しい答えが得られます。なぜこれが起こったのか誰か知っていますか?