1

今日、私はエラトステネスのふるいをプログラムしようとしましたが、素数を提供する限り機能します。しかし、理解できない動的配列に問題があります。

最初の問題: n に「大きな」値 (たとえば 120) を入力しようとするとすぐに、プログラムがクラッシュし、メモリを割り当てることさえできません。

2 番目の問題: 50 のような値を入力すると、正しい素数を取得できますが、配列が削除される前にクラッシュします。

3 番目の問題: 5 のような非常に小さい値を入力すると、プログラム全体を実行できますが、正しい数値が表示され、メモリが削除されます。

しかし、なぜそれがそれほど異なる動作をするのか理解できません。120 個のブール値が私の記憶をクラッシュさせることはありません。少なくとも私はそう思います。また、50 個の値の配列を削除できないのに、実際には 5 個の値の配列を削除できるのはなぜですか? 誰が私に何が問題なのか教えてもらえますか?

int n;
cin >> n;
n=n+1;
bool *feld = new bool[n];
for(int i=2;i<n;i++)
{
    int j=i*i;
    feld[j]=true;
    for(;j<n;j+=i)
        feld[j]=true;
}
for(int i=2;i<n;i++)
    if(!feld[i])
        cout << i << endl;
    else;
delete[] feld;
feld = NULL;
4

3 に答える 3

6

あなたの問題はここにあります:

int j=i*i;
feld[j]=true;

. _ j < n_j >= n

于 2013-09-23T13:50:26.897 に答える
5

このコードは間違っています

bool *feld = new bool[n];
for(int i=2;i<n;i++)
{
    int j=i*i;
    feld[j]=true;
    ...
}

n == 10 および i == 9 の場合、j == 81 としますが、bool 配列には 10 個の要素しかありません。

これは、バグのあるプログラムを作成するときにどのように機能するかです。機能しているように見える場合もあれば、正しい答えを返す場合もあれば、クラッシュする場合もあります。これは非常に重要な教訓であり、早い段階で学べたのは幸運なことです。

于 2013-09-23T13:51:04.343 に答える
0

実際には、それだけがfeld[j]=true;エラーの原因ではありません。

また、ループの前にその行はまったく必要ありません。

ループ内の最初のケースだからです。

于 2013-09-23T14:58:13.340 に答える