1

私はエラトステネスのふるいを実装しましたが、うまくいきました。しかし、MAX 値を 50000 などに増やすと、未処理の win32 例外でアプリケーションがクラッシュします。これは、スタックオーバーフローが原因で発生したと思います。

今私の質問は、どうすればこれを防ぐことができますか?

#define MAX 50000
void Sieb_des_Eratosthenes()
{
    char Zahlen[MAX + 1] = {0};
    int i, j, x;

    for(i = 2; i <= MAX; i++)
    {
       if(Zahlen[i] == 0)     
       {
           Zahlen[i] = 1;
           for(j = i * i; j <= MAX; j += i)
           {
                 Zahlen[j] = -1;
           }      
       }
    }
}

私の考えはメモリを割り当てることでしたが、これは機能しません

#define MAX 50000
int Sieb_des_Eratosthenes()
{
    int i, j, x;
    char *array;
    array = malloc((MAX + 1) * sizeof(*array));
    if (array==NULL) {
       printf("Error allocating memory!\n");
       return -1; //return with failure
    }

    for(i = 2; i <= MAX; i++)
    {
       if(array[i] == 0)     
       {
           array[i] = 1;
           for(j = i * i; j <= MAX; j += i)
           {
                 array[j] = -1;
           }      
       }
    }
}
4

3 に答える 3

3

関数が失敗する元の問題は、この for ループにあります。

for(j = i * i; j <= MAX; j += i)

i が 46349 以上になると、結果はi * iオーバーフローし、j は の値を取得して-2146737495から失敗します。Zahlen[j] = -1;

于 2013-04-24T07:42:17.300 に答える
1

int は最大 -2^31 から 2^31 までしか保持できません: http://en.wikipedia.org/wiki/Integer_(computer_science)

あなたのオーバーフローint

于 2013-04-24T07:41:43.903 に答える