2011-01-30 14 views
0

これは私が素数を生成するために球オンライン裁判官で提出したコードですが、私はセグメンテーションフォルトを取得しています。目的は、与えられた範囲mからn(n> m)の間のgenerate prime numbersです。これは、Sieve of Eratosthenesアルゴリズムを使用して実装されます。どこが間違っているのか教えてください。感謝:)私のコードにセグメンテーションフォルトがあります

#include <stdio.h> 
#include <math.h> 

int main(){ 
    long int m,n,c1,c2,c3; 
    int t; 

    scanf("%d",&t); 
    while(t--) 
    { 
     scanf("%d %d",&m,&n); 


     //create prime list 
     short int *prime; 
     prime = (short int*)malloc((n-m)*sizeof(short int)); 

     //fill list with 0 - prime 
     for(c1 = 2; c1 <= n; c1++){ 
       prime[c1] = 1; 
     } 

     //set 1 and 0 as not prime 
     prime[0]=0; 
     prime[1]=0; 

     //find primes then eliminate their multiples (0 = prime, 1 = composite) 
     for(c2 = 2;c2 <= (int)sqrt(n)+1;c2++){ 
      if(prime[c2]){ 
       c1=c2; 
       for(c3 = 2*c1;c3 <= n; c3 = c3+c1){ 
        prime[c3] = 0; 
       } 
      } 
     } 

     //print primes 
     for(c1 = m; c1 <=n; c1++){ 
      if(prime[c1]) printf("%d\n",c1); 
     } 
    }  
    return 0; 
} 
+3

セグメント違反はどこにありますか? –

+1

segfaultの場所についての情報はありますか?巨大なコードブロックで単一のバグを発見するのは本当に難しいことです。 – templatetypedef

+1

GDBを使用してsegfaultが表示される場所を決定します – shybovycha

答えて

3

c3は、最も内側のループにnまで行くことができますが、あなただけのあなたの配列に未満nスロットを割り当てることができます。実際、nスロットを割り当てた場合でも、インデックスnは割り当てたスロット数の1倍になります。最悪の場合、配列の終わりを過ぎていくらかのメモリを破壊してしまい、うまくスタックをゴミ箱に入れられません。せいぜい、あなたはsegfaultを取得すると思います。 X <= nX < nに変更するか、配列内にもう1つの要素を割り当てることをお勧めします。実際には、ご使用のアレイに(n + 1) * sizeof(short)バイトを割り当ててください。

また、tを設定することはなく、決してユーザー入力を検証することはありません。後者は、入力に制約がある競争のためのものであれば大丈夫かもしれません。また、prime配列を解放することは決してないので、メモリリークが発生します。

それはあなたが&あなたは[n]はプライム をアクセスしてる(nm)でメモリを割り当てているだろう。もちろん、
+0

サーバがプログラムをコンパイルしようとしているので、t、m、nがユーザ入力セクションで指定された制限内にあると仮定しました。私はそれらを検証する必要がありますか? – jaykumarark

+0

@ jaymumarark:ユーザー入力からtが引っ張られた場所が見つかりませんでした。だから、裁判官はあなたにごみの入力を与えないと言ったと仮定して、m、n、tは未確認に行くことができます。 – siride

1

、プライムが長いだけで1要素であるとき

0

はおそらくこれを避けたい:

//set 1 and 0 as not prime 
     prime[0]=0; 
     prime[1]=0; 
0

malloc(nm)ですが、次のループではprime [2..n]を初期化します。 n-mは1E5以下であるが、n自体は1E9(むしろ巨大である)である可能性がある。 malloc(1E9)はおそらく失敗するので、あなたの簡単な考え方はおそらく実装できません。よりスマートなアルゴリズムが必要です。

関連する問題