2015-10-19 179 views
1

我有一個素數的程序下面的代碼:意外的輸出

class Test2 { 
    public static void main(String[] args) { 
     System.out.println("Prime numbers inbetween 2-100: "); 
     boolean isComposite = false; 
     for (int i = 2; i <= 100; i++) { 
      if ((i % 2) == 0) { 
       continue; 
      } 

      for (int k = 3; k < i; k++) { 
       if ((i % k) == 0) { 
        isComposite = true; 
        break; 
       } 
      } 

      if (!isComposite) { 
       System.out.println(i); 
       isComposite = false; 
      } 
     }//End for 
    }//End main() 
}//End class 

我的問題是,當我運行代碼,我得到以下輸出:

Prime numbers inbetween 2-100: 
3 
5 
7 

這種簡單的代碼,但我無法弄清楚它有什麼問題!任何幫助,將不勝感激。

此外,什麼是在Java中發現素數的最佳算法?

+0

確保包含2作爲素數。 – pushkin

+2

你也可以直接打印'2'作爲原始數字,然後從'i = 3'開始並將'i'增加2,這樣你就可以跳過每一個偶數 – SomeJavaGuy

+0

@Kevin Esche好主意!從來沒有想過會這樣做。 – RobertR

回答

4

您需要在迴路中的標誌isComposite重置爲:

for (int i = 2; i <= 100; i++) { 
      isComposite = false; 
      if ((i % 2) == 0) { 
       continue; 
      } 

      for (int k = 3; k < i; k++) { 
       if ((i % k) == 0) { 
        isComposite = true; 
        break; 
       } 
      } 

      if (!isComposite) { 
       System.out.println(i); 
       isComposite = false; 
      } 
     } 

否則它將永遠保持true循環。現在它打印:

Prime numbers inbetween 2-100: 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

+0

謝謝,知道這是愚蠢的:P將盡快選擇最佳答案。 – RobertR

4

你忘了復位isComposite,所以9被檢測爲複合後,全部的數字會被誤認爲是複合:

for (int i = 2; i <= 100; i++) { 
     isComposite = false; // add this 
     ... 

PS,2也是一個素數,你的代碼未命中,讓你應分別打印:

System.out.println(2); 
    boolean isComposite = false; 
    for (int i = 3; i <= 100; i++) { 
     isComposite = false; 
     if ((i % 2) == 0) { 
      continue; 
     } 

     for (int k = 3; k < i; k++) { 
      if ((i % k) == 0) { 
       isComposite = true; 
       break; 
      } 
     } 

     if (!isComposite) { 
      System.out.println(i); 
      isComposite = false; 
     } 
    }//End for 
+0

謝謝,將在頂部添加兩個'println()'語句。 – RobertR