public class Demo3 { public static void main(String[] args) { boolean b; for (int i = 2; i < 100; i++) { //遍歷2-100的所有數 b = true; int k = (int) Math.sqrt(i); //開平方 for (int j = 2; j <= k; j++) { if (i % j == 0) { b = false; break; } } if (b) { System.out.println(i); } } } }
在這里,有2個關鍵的變量,我估計解釋一下你就能看得明白這個算法了.
1.關於變量k.變量k的作用是優化整個算法,因為比如要判斷一個數13是不是素數,我們沒必要從2循環到13.只要循環到對13開根號.13開根號大概是3.6多,強轉為int類型后是3.也就是說只要檢查2,3是否能整除13.如果不能,13肯定是一個素數.因為比如48這個數,你前面檢測到被4整除等於12,那么繼續循環超過Math.sqrt(48)的話,無非就是得到一個反過來的被12除等於4的結果.這個沒有必要.
2.關於變量j.注意點1:j是在最外層的循環體中定義的.這個時候剛定義完,j的值是初始的0.然后j從2開始,一直到小於等於k結束.這里是控制嘗試整除的循環次數.一旦發現在這個范圍內有數能整除i,那么就跳出循環.
所以,對於你不理解的那個部分,首先確定一點,程序只要執行到break,就說明這個數是素數.
例如我們這次k = 10,那么是要從j = 2到10逐一檢測 i 是不是能被 j 整除.當j = 7的時候比如可以整除了,就跳出當前內層循環了.這時候, j 顯然是不大於 k 的,因為只要是中途跳出,因為內層循環(j = 2; j <= k; j++)的控制,只要在循環過程中跳出來的,那么j 肯定 <= k.
只有循環到j = 10依然沒有break的話,根據for循環的執行順序,會執行j++,然后去判斷j <= k 是否為true,為true則繼續下一次循環,否則循環結束.而在這里,如果到10還沒有能夠整除的話,j是會在10的基礎上自增的.這時候j就=11了.
那么if ( j > k )就不成立了,則i 不會被輸出.
總結一點:就是如果中途or最后一次循環,找到能整除的數了,那么因為break的關系,最后就不會執行 j++, 所以j <= k的條件是能保證的. 換言之,如果j > k (亦即j <= k 的取反)表示沒有找到能整除的數.其實j最大也就只能等於k+1.
當然還有一種投機取巧的辦法。看代碼。。。
public static void main(String[] args){ System.out.println("2"); System.out.println("3"); System.out.println("5"); System.out.println("7"); for(int i=10; i<100; i++){ if(i%2!=0 && i%3!=0 && i%5!=0 && i%7!=0){ System.out.println(i); } } }
