2013-10-02 91 views
-6

我想計算10001st素數,如問題7 euler project。這是我做了什麼:計算10001st素數

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

它返回104033,但正確答案是104743。我的問題在哪裏?

+2

調試!請學會使用一個。 –

+1

你可以發佈問題嗎?我們並不喜歡追蹤不必要的外部鏈接。你怎麼弄出錯誤? – iamnotmaynard

+3

你確定問題不在於'Helper.isPrime'嗎?發佈代碼 – Joni

回答

7

你您的代碼有三個問題:

  1. 您的代碼不會測試2是否爲總數,所以您在計算中錯過了這一點。您應該將counter初始化爲0或1,而不是2.
  2. 通過使用while (i<=10001),您將計數,直至找到10002個素數。既然你也不算數2,那麼你需要經過兩步,你需要去哪裏。環路測試應該是while (i<10001)
  3. 由於你的回答是低於比正確的答案(即使你的循環去了兩個素數應該已經停止),你的Helper.isPrime方法顯然識別太多的數字作爲素數。它將需要修復,但由於您沒有發佈代碼,因此無法說明需要修復它。
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第二個質數,沒有

問題:

  1. 爲什麼計數器,環路2
  2. termiating條件,EVN開始如果 號被發現我們沒有終止
+0

我不認爲你理解這個問題。 – iamnotmaynard

+0

對不起,但如果我提到的兩個問題得到解決,即計數器從1開始而不是從2開始並且終止條件從i <= 10001變爲i <10001,程序將正常工作。 – coder

-1

嘗試

int find=10001; 
    int counter =1; 
    int currentNumber=2; 
    while (counter <= find){ 
     if(Helper.isPrime(currentNumber)){ 
      counter++;    
     } 
     currentNumber++; 
    } 
    System.out.println(currentNumber-1);