0

このプログラムをデバッグすると、max が渡した値ではなくガベージ番号であることがわかります。

#include <iostream>
#include <cmath>

float findPrimes(int max) {

    float* primes = new float[max];

    bool* boolarray = new bool[max];
    for(int i=0; i<=max; i++) {
        boolarray[i] = true;
    }

    int x = 1;

    for(int i=2; i<=sqrt(max); i++) {
        if(boolarray[i]) {
            for(int j=pow(i, 2)+x*i; j<=max; x++)
            {
                boolarray[j] = false;
            }
        }
    }

    int n = 0;

    while(n<=max) {
        if(boolarray[n]) 
            primes[n] = boolarray[n];
        n++;
    }

    return primes[max];

}

int main() {

    float answer = findPrimes(6);

    printf("%f\n", answer);

    _sleep(10000);

    return 0;
}

デバッグ時に max がジャンク番号であることを示しているため、プログラムが実行されません (実行されますが、何も起こりません)。(エラトステネスのふるいを使用して) すべての計算を正しく行っていると確信しています。


編集:

#include <iostream>
#include <cmath>

float findPrimes(int max) {

    std::cout << max << "\n";

    float* primes = new float[max-1];

    bool* boolarray = new bool[max-1];
    for(int i=0; i<=max-1; i++) {
        boolarray[i] = true;
    }

    int x = 1;

    for(int i=2; i<=sqrt(max); i++) {
        if(boolarray[i]) {
            for(int j=pow(i, 2)+x*i; j<=max-1; x++)
            {
                boolarray[j] = false;
            }
        }
    }

    int n = 0;

    while(n<=max-1) {
        if(boolarray[n]) 
            primes[n] = boolarray[n];
        n++;
    }

    return primes[max-2];

}

int main() {

    printf("%f\n", findPrimes(6));

    _sleep(10000);

    return 0;
}
4

1 に答える 1

1

範囲外にアクセスします。

bool* boolarray = new bool[max-1];
for(int i=0; i<=max-1; i++) {
    boolarray[i] = true;
}

maxが5だとしましょう。最初の行は0から3までの番号が付けられた4つのboolを割り当てます。ループは0から4までループします。しかしエントリ4はありません。0、1、2、3の4つのエントリしかありません。

あなたはおそらくこれを行うべきです:

bool* boolarray = new bool[max];
for(int i=0; i<max; i++) {
    boolarray[i] = true;
}

ここで、maxが5の場合、0から4までの番号が付けられた5つのboolを割り当てます。ループは0から4になります。これは、必要なものです。

于 2013-03-03T01:15:53.827 に答える