-5

問題7のeuler projectのように10001番目の素数を計算したいです。これは私がやったことです:

int i=0;
int counter=2;
while (i<=10001){
    counter++;
    if (Helper.isPrime(counter))
        i++;
}
Helper.println(counter);

返ってき104033ますが正解は104743です。私の問題はどこですか?

4

3 に答える 3

9

コードには次の 3 つの問題があります。

  1. あなたのコードは 2 が素数かどうかをテストしていないため、カウントにそれがありません。counter2 ではなく、0 または 1 に初期化する必要があります。
  2. を使用するwhile (i<=10001)と、素数が 10002 個見つかるまで数えることになります。2 も数えていないので、行く必要がある場所から 2 歩進んでいます。ループ テストはwhile (i<10001).
  3. あなたの答えは正しい答えよりも低いため (ループが停止するはずの場所を素数 2 つ過ぎたとしても)、Helper.isPrimeメソッドは明らかに素数として識別している数が多すぎます。修正する必要がありますが、コードを投稿していないため、修正に何が必要かはわかりません。
于 2013-10-02T17:57:05.077 に答える
1

正しいバージョン

int i=0;
int counter=1; // chnage initial value of counter
while (i<10001){ // change terminating condition
    counter++;
    if (Helper.isPrime(counter))
        i++;
}
Helper.println(counter);

説明/バージョンの問題

最初に小さな部分集合について解いて、3 番目の素数を出力したいとします。あなたのコードに従って

i=0, counter  =3, is 3 prime yes i=1
i=1  counter = 4 is 4 prime No i =1
i=1 counter = 5 is 5 prime Yes i=2
i=2 counter =6 is 6 prime No i=2
i=2 counter =7 is 7 prime yes i=3
i=3 counter =8 is 8 prime no i=3
i=3 counter = 9 is 9 prime no i=3
i=3 counter =10 is 10 prime no i=3
i=3 counter =11 is 11 prime yes i=4
loop terminates
ans: 11

は 11 2 番目の素数、いいえ

問題:

  1. なぜカウンターが 2 から始まるのか
  2. ループの終了条件、番号が見つかった場合でも終了していません
于 2013-10-02T17:45:34.947 に答える
-1

試す

   int find=10001;
   int counter =1;
   int currentNumber=2;
   while (counter <= find){
       if(Helper.isPrime(currentNumber)){
           counter++;              
       }
       currentNumber++;
   }
    System.out.println(currentNumber-1);
于 2013-10-02T18:00:19.547 に答える