-1

こんにちは、私はすべての素数の合計を 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;
}
4

3 に答える 3

8

私が見つけることができる唯一の論理エラーは、ループ内に再設定isPrimeすることは決してないということですtrueが、それは無限ループを引き起こすべきではなく、間違った結果になるだけです。

無限ループに入るとは思えませんが、最適ではないため、時間がかかると思います。iまですべての番号をチェックする必要はありませsqrt(i)i/2

さらに良いことに、素数のふるいを生成し (これをググってください)、それらを足し合わせることができます。これは非常に効率的です。

于 2013-01-04T22:06:34.927 に答える
4

無限ループはしていないと思います。isPrimeLuchian Grigore が指摘したように、 に設定するのを忘れてtrueいますが、コードの実行にも非常に長い時間がかかります。なお、試し割りは一度やめても構いませんj*j > i

于 2013-01-04T22:07:37.753 に答える
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 を忘れないでください。

于 2013-01-04T22:12:38.657 に答える