-1

私はこれを解決しようとしています、そして私はこれを思いつきました

#include <stdio.h>
#define primeLimit 100000

int prime (long int Start2,  long int Stop2 )
{
    long int a[primeLimit];
    long int i,j,k,l;
    for (i=Start2;i<=Stop2;i++) {
        a[i] = 1;
    }
    for (i=Start2;i<=Stop2;i++) {
    if (a[i]!= 0 && i!=1) {
        for (j=2; j*j< i;j++) {
            if(i%j==0)
                break;
        }
        if(j*j > i) {
            printf(" \n %d",i);
            l = i;
            for (k = i*i; k< Stop2;) {
                a[k] = 0;
                k = k+l;
            }
        }
        else {
            a[i] = 0;
        }
    }
}

return 0;
}

int main(void)
{
    long int start,stop,a,look;
    scanf("%ld", &look);
    for (a=1;a<=look;a++) {
        scanf("%ld %ld", &start,&stop);
        prime (start,stop);
    }
    return 0;
}

私はGNUGCCコンパイラ、32ビットWindows7PCでCodeBlocksIDEを使用しています。コンパイラで実行したときのコードは問題ありませんでした。しかし、送信すると、ランタイムエラー(SIGSEGV)が表示されます。どこが間違っているのか/どのように改善するのかを誰かに指摘してもらえますか?

ありがとうございました

4

1 に答える 1

1

許容される入力の範囲は 1 から 1000000000 ですが、配列には 100000 要素しかありません.. 2 つの入力の差です。i-Start2ork-Start2ではなくiorで索引付けする必要がありますka[primeLimit+1]にアクセスする必要があるため 、a[Stop2-Start2]つまりが必要a[100000]です。

于 2012-10-05T16:18:44.370 に答える