1.什么是質數?
又稱素數,只能被1和它本身整除的自然數,即除了1和它本身作為約數,沒有別的約數了。
--->從2開始到這個數-1都不能被這個數本身整除。
2.方式一:
package cn.tust.cycle; /* * 輸出50000以內的質數 * * */ public class PrimeNumber { public static void main(String[] args) { boolean isFlag = true ; long starttime = System.currentTimeMillis(); //遍歷這50000個數 for(int i = 2;i<=50000;i++) { //質數就是只能被1和它本身整除的自然數 for(int j=2;j<i;j++) { if(i%j == 0) { isFlag = false; } } if(isFlag ==true) { System.out.println(i); } isFlag = true; } long endtime = System.currentTimeMillis(); System.out.println("所花費的時間是:"+(endtime-starttime)); } }
輸出結果:所花費的時間是:5637ms
方式一中當i能夠整除某一個j時,即當isFlag第一次被賦值false的時候,就不要再進行j的循環了,可以直接進行下一次的i的循環。
2.1 優化1:
package cn.tust.cycle; /* * 輸出50000以內的質數 * * */ public class PrimeNumber { public static void main(String[] args) { boolean isFlag = true ; long starttime = System.currentTimeMillis(); //遍歷這50000個數 for(int i = 2;i<=50000;i++) { //質數就是只能被1和它本身整除的自然數 for(int j=2;j<i;j++) { if(i%j == 0) { isFlag = false; break; //優化1:只對非質數的自然數是有效的 } } if(isFlag ==true) { System.out.println(i); } isFlag = true; } long endtime = System.currentTimeMillis(); System.out.println("所花費的時間是:"+(endtime-starttime)); } }
輸出結果:所花費的時間是:544ms
2.2優化2:
package cn.tust.cycle; /* * 輸出50000以內的質數 * * */ public class PrimeNumber { public static void main(String[] args) { boolean isFlag = true ; long starttime = System.currentTimeMillis(); //遍歷這50000個數 for(int i = 2;i<=50000;i++) { //質數就是只能被1和它本身整除的自然數 for(int j=2;j<Math.sqrt(i);j++) { //優化2:對本身就是質數和不是質數的自然數都有效 if(i%j == 0) { isFlag = false; break; //優化1:只對非質數的自然數是有效的 } } if(isFlag ==true) { System.out.println(i); } isFlag = true; } long endtime = System.currentTimeMillis(); System.out.println("所花費的時間是:"+(endtime-starttime)); } }
輸出結果:所花費的時間是:69ms
3.方式二:
public class PrimeNumberTest2 { public static void main(String[] args) { long startTime = System.currentTimeMillis(); label:for(int i=2;i<50000;i++) { for(int j=2;j<Math.sqrt(i);i++) { if(i%j == 0) { continue label; } System.out.println(i); } } long endTime = System.currentTimeMillis(); System.out.println("所花費的時間是:"+(endTime-startTime)); } }
為什么要在內循環中將循環的次數修改為i的平方根?
解答:以97為例,當97去除以某個數的時候,那么結果很定也在2-97的這根坐標軸上,除以2的時候得到48.5,所以48之后的數就不用再去循環了,因為與48之后的數配對的都是大於1小於2的數;當除到這個數的平方根的時候,得到的結果也是這個數的平方根,當再往上除的時候,所得結果都是剛才已經配對過的數,即都是剛才的除數,所以循環只要到Math.sqrt(i)就行。