4.1優化演算法-----輸出素數

最簡程式碼請直接移步文末

原始碼:https://www.cnblogs.com/Tianhaoblog/p/15077840.html

對應優化如下

優化一:在遍歷內迴圈時,只要滿足一個“非1非自身”的數可以整除,直接break跳出迴圈,因為此時“i”已經不是質數。對“非質數”資料優化明顯;

優化二:在遍歷內迴圈時,判斷“i”是否為質數,不用遍歷2-->i,只要判斷2-->根號i,若不能被整除,就說明“i”是質數。對所有資料均有優化,但因優化一存在,非質數已經跳出迴圈,所以此條優化更有助於“質數”的資料優化;



假設i=100,

判斷是否在兩數相乘等於第三個數

a × b = c

因為不包含1,所以 a 、b 兩個數最小均為 2 ,且最大均為c / 2。

a = 2 時,b = c / 2,滿足條件a × b = c;

a = c / 2 時,b = 2,滿足條件a × b = c;

a 從 2 開始不斷遞增,到 c / 2截止(2,3,4,5,6,7————c / 2)

此時 b 從 c / 2 開始不斷減小,到 2 截止(c / 2————7,6,5,4,3,2)

此時 a = 2 和 b = 2 時相當於重複遍歷,找到 a 和 b 的臨界點,停止遍歷,這樣就不會重複了,臨界點就是 a = b 的點,如上述例子中的10,當 a = b 時,恰好 a 為根號c

程式碼如下:

  1. public class PrimeNumber {
  2. public static void main(String[] args){
  3. long start = System.currentTimeMillis();//開始時間
  4. int isLine = 10;
  5. boolean isFlag = true;
  6. for (int i = 2; i <100000; i++) {//輸出100000以內的素數
  7. for (int j = 2; j <= Math.sqrt(i); j++) { //優化二:只取根號i ---對本身質數的資料優化!!!!
  8. if(i % j == 0){
  9. isFlag = false;
  10. break;//優化一:滿足一個整除就跳出迴圈---對本身為非質數的資料優化!!!!!
  11. }
  12. }
  13. if(isFlag){
  14. System.out.print(i + " ");
  15. isLine--;
  16. if(isLine == 0){
  17. System.out.println();
  18. isLine = 10;
  19. }
  20. }else{
  21. isFlag = true;
  22. }
  23. }
  24. long end = System.currentTimeMillis();//結束時間
  25. System.out.println("程式執行時間:" + (end-start));//輸出程式執行時間
  26. }
  27. }

  1. //輸出100000以內的素數
  2. 2 3 5 7 11 13 17 19 23 29 //每行10個數據
  3. 31 37 41 43 47 53 59 61 67 71
  4. 73 79 83 89 97 101 103 107 109 113
  5. ......//省略。。。
  6. 99761 99767 99787 99793 99809 99817 99823 99829 99833 99839
  7. 99859 99871 99877 99881 99901 99907 99923 99929 99961 99971
  8. 99989 99991
  9. 程式執行時間:136

最簡版素數程式碼:

  1. public class PrimeNumber {
  2. public static void main(String[] args){
  3. label:for (int i = 2; i <100000; i++) {
  4. for (int j = 2; j <= Math.sqrt(i); j++) {
  5. if (i % j == 0) {
  6. continue label;//存在可以整除的數,跳出當前迴圈,回到外層迴圈繼續執行。
  7. }
  8. }
  9. System.out.println(i);//因非質數已經通過continue跳出本層迴圈,凡是可以執行到此位置的,均為質數
  10. }
  11. }
  12. }