2016-10-25 41 views
1

N番目の素数を印刷する必要があります。 例:
第1の素数は2
第2の素数は3
です。
。スタックする2と3を追加)
1:
10日素数は29で、次のように....

N番目の素数を印刷するコード

私のアルゴリズムがあります。そうで
2)スタックのN <は=サイズであれば、位置にある項目を取得し、nおよび出力回答
3)、素数をチェックするために)
4素数かどうかを確認し、スタックの最後の要素から開始する、の各要素から分割スタック。スタック内の要素の残りの部分が0であれば、素数ではありません。プライム場合)ループ
5を破る、
6をスタックに追加します)奇数のみ

私のコードを検索することです:

#include <iostream> 
using namespace std; 

int main() { 
    int number, count = 0; 
    cin >> number;   //position of prime number 
    int a[number]; 
    a[0] = 2; 
    a[1] = 3; 
    int top = 1; 
    if (number <= 2) { 
     cout << a[number - 1] << endl; 
    } else { 
     for (int i = 5; i <= 10001; i += 2) { 
      for (int j = 0; j <= top; j++) { 

       if (i % a[j] != 0) { 
        count++; 

       } 
       if (count == (top + 1)) { 
        a[++top] = i; 
        if ((count + 1) == number) { 
         cout << a[top]; 
         break; 
        } 

       } 

      } 

     } 

    } 
    return 0; 
} 

このコードは、突然どのoutput.Whatを与えることなく作業を停止しています私のコードに欠陥がありますか?

+0

なぜあなたは常に2だけインクリメントされ、数字が奇数であることを保証していれば、配列の最初の数字で割りますか?そのチェックは不要です。 –

+0

@ LuisColoradoプライムナンバーは常に奇数になるので...基本的に時間の複雑さを減らすため – user6889367

+0

@LuisColoradoしかし、このコードはまだ大きな数字の時間がかかります。 – user6889367

答えて

1

と書いておきます。これはループロジックに問題があります。あなたはi0からtopまでのすべての数字で裁定する必要があります。iで割り切れません。の数が増えますか?それらのいずれかによって分かれていない場合は、それが増加しているようです。

したがって、ia[j]で割り切れるかどうかをテストするようにロジックを変更してください。そうであれば、ループから抜け出す。あなたがループ(j == top)の終わりに達し、それらのいずれかをうまく分割しなかった場合、素数であることが分かり、countを増やすことができます。また、あなたが比較チェックtopにカウントは(あなたがすべてのトライアル部門を行っているすなわち後)jループの外にあるべき

for (int i = 5; i <= 10001; i += 2) { 
     for (int j = 0; j <= top; j++) { 
      if (i % a[j] == 0) { 
       break; 
      } 
      if(j == top) 
      { 
       count++; 
       a[++top] = i; 
       break; 
      } 
     } 
     if (count == number) { 
      cout << a[top]; 
      break; 
     } 
    } 

編集:あなたも2にcountを初期化する必要はなく、0に2と3を考慮に入れてください。

+0

先生、私はプライムとして25を得ています。また、3プライムは7として表示されます – user6889367

+0

あなたはカウント= 2を初期化する必要があります、それを説明するコードを編集しました – samgak

+0

ありがとう、ありがとう – user6889367

0

int a[number];は間違っています。numberは定数ではありません。むしろ、int *a=new int[number]として

+0

いいえ、コードはまだ動作していませんが、int [数値]は問題ではないと思います。他の多くのコードで試してみました。 – user6889367

+0

@macroland、私はC++を恐れています実行時に長さが決定される自動配列を使用します。質問はC++ではなくタグ付けされているので、ここではエラーではないと思います。ちなみに、この回答は尋ねられる問題に対処していますか? –

+0

@ LuisColorado:そうです、後でそれを理解しました。 – macroland