2015-10-12 152 views
0

我不知道爲什麼我的代碼在輸入某些nthprime數字時不起作用。我試圖改變我的代碼幾次,但對於每一個nthprime我做它的工作,我讓其他人更糟。所以,如果我改變自己的代碼,使其爲nthprime = 8工作,我意識到nthprime = 7,其他人停止工作。任何人都可以指出我所做的具體缺陷,或者我應該重新思考我的代碼的大綱。謝謝。找到第n個素數

public class NthPrime { 

public static void main(String[] args) { 

    int nthprime; 

    System.out.println("Enter value for n:"); 
    nthprime=IO.readInt(); 

    while(nthprime <= 0){ 
     System.out.println("Enter a positive value for n"); 
     nthprime=IO.readInt(); 
    } 

    if(nthprime == 1){ 
     System.out.println("The nth prime number is: "+2); 
    } 
    if(nthprime == 2){ 
     System.out.println("The nth prime number is: "+3); 
    } 

    if(nthprime > 2){ 

    int prime=2; 
    int num=3; 
    int square; 
    boolean nonprime=false; 

    while(prime < nthprime){ 
     prime++; 
     num+=2; 
     square = (int) Math.sqrt(num); 
     for (int i=3; i <= square; i++){ 
      if (num % i == 0){ 
       nonprime=true; 
       num+=2; 
      } 
      if(nonprime==false){ 
       prime++; 
       num+=2; 
      } 
     } 
    } 
    System.out.println("The nth prime number is: "+num); 
    } 
} 

}

+2

爲什麼你在做num + = 2,無論你的for循環中發生了什麼? – ergonaut

+0

@ergonaut素數不可能是偶數,所以如果加2,那麼跳過偶數。 –

+2

@WyattLowery我知道,但他在任何一個分支都這樣做。 – ergonaut

回答

1

檢查這個循環:

for (int i=3; i <= square; i++){ 
     if (num % i == 0){ 
      num+=2; 
     } 
     else { 
      prime++; 
      num+=2; 
     } 
    } 

看樣子你想通過所有的奇數循環到你數的平方根。如果其中一個分開,那麼它應該停止循環並將其標記爲非素數。如果它沒有劃分任何數字,則應該將其標記爲素數,但即使這樣做也應在循環完成後進行。 (例如,當i>平方時)

我不想給你答案,因爲看起來你想要自己修復你現有的循環。但是一種策略是例如將其標記爲非素數(以布爾值爲例),然後在循環之後檢查布爾值並在布爾值指示素數爲素數時增加素數(素數++)。請記住重新初始化布爾值,以便它在下次訪問for循環時正確設置。

+0

所以我這樣做: int prime = 2; \t \t int num = 3; \t \t int square; \t \t boolean nonprime = false; \t \t \t 而\t(原

+0

更新您的問題。這些評論不應該包含像這樣的過多的代碼,這很難閱讀。 – ergonaut

+0

但是我相信你在整個雙循環之前重新初始化布爾值,而不是在兩個循環之間。 – ergonaut

0

創建另一種方法來檢查數字是否爲素數,並使用while循環來獲取素數。

public static void main(String[] args) { 
    ... 

    if (nthprime == 1) { 
     System.out.println("The nth prime number is: 2"); 
    } else { 
     int num = 3; 

     for (int i = 2; i <= nthPrime; i++) { 
      while(!isPrime(num)) { 
       num += 2; 
      } 

      num += 2; 
     } 

     System.out.println("The nth prime number is: "+ (num - 2)); 
    } 
} 

private static boolean isPrime(int n) { 
    int sqrt = (int) Math.sqrt(n); 

    for (int i = 2; i <= sqrt; i++) { 
     if (n % i == 0) { 
      return false; 
     } 
    } 

    return true; 
} 
+0

嗯謝謝你,這就是我所做的,我想創建另一種方法來檢查素數,然後將其納入循環效果更好。謝謝。 –