100以内所有质数的输出
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)就行。