質數:
- 又稱素數,只能被1和它本身整除的數就是質數。
難點:
- 需要兩層循環,外層循環99遍;
- 內層循環,控制除數為2到98(也就是2到被除數前面的一個數)。
- 為什么從2開始?因為所有數都能被1整除。
- 需要定義一個變量flag來記錄某個數是不是質數
- 內層循環結束后需要重新把flag重置為true
方法一:
import org.junit.Test; public class Demo { @Test public void primeNumberTest() { boolean flag = true; for (int i = 2; i <= 100; i++) { for (int j = 2; j < i; j++) { if (i % j == 0) { //為什么要定義變量flag? //因為只能被1和它本身整除的才是質數,而如果if的判斷條件為true //則這個數不是質數。因為進入if判斷條件,意味着這個數能被2到i-1的某個數整除 flag = false; } } if (flag) { System.out.print(i+","); } //因為內層循環會把flag的值設置為false //如果沒有下面的語句,flag的值在進入內層循環之后將永遠為false flag = true; } } }
結果:
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,
方法二:
與方法一相比有所改進的地方,把flag放在外層與內層循環之間,這樣就不用每次結束內層循環后去重置flag的值。
import org.junit.Test; public class Demo { @Test public void primeNumberTest() { for (int i = 2; i <= 100; i++) { //因為flag定義在外層循環與內層循環之間,所以每次開始外層循環時flag的值都是true //這樣就不需要在內層循環結束時重置flag的值為true了 boolean flag = true; for (int j = 2; j < i; j++) { if (i % j == 0) { //為什么要定義變量flag? //因為只能被1和它本身整除的才是質數,而如果if的判斷條件為true //則這個數不是質數。因為進入if判斷條件,意味着這個數能被2到i-1的某個數整除 flag = false; } } if (flag) { System.out.print(i + ","); } } } }
結果
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,
方法三:
改進:在if判斷語句后面加了break,因為只要有能被2到i-1當中的一個數整除,這個i就不是質數,就沒有必要繼續循環下去
import org.junit.Test; public class Demo { @Test public void primeNumberTest() { System.out.println(start); for (int i = 2; i <= 10000; i++) { boolean flag = true; for (int j = 2; j <i; j++) { if (i % j == 0) { flag = false; break;//這是改進的地方,因為只要有能被2到i-1當中的一個數整除,這個i就不是質數,就沒有必要繼續循環下去 } } if (flag) { System.out.print(i+","); } } } }
方法四:
改進:把j的取值范圍由<i,改為<=Math.sqrt(i)
import org.junit.Test; public class Demo { @Test public void primeNumberTest() { for (int i = 2; i <= 100; i++) { boolean flag = true; for (int j = 2; j <= Math.sqrt(i); j++) { if (i % j == 0) { flag = false; break; } } if (flag) { System.out.print(i + ","); } } } }
方法四的小改進:
加了一個count,去統計質數的個數
import org.junit.Test; public class Demo { @Test public void primeNumberTest() { int count=0; for (int i = 2; i <= 100; i++) { boolean flag = true; for (int j = 2; j <= Math.sqrt(i); j++) { if (i % j == 0) { flag = false; break; } } if (flag) { System.out.print(i + ","); count++; } } System.out.print("質數個數為:"+count); } }
結果:
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,質數個數為:25
后記:
2020年3月3日 09:45AM 星期二 農歷2020年二月初十 上海 晴 溫度:12°,比較冷。