Java中判断质数的几种方法
说明:
1.质数:又称素数。是一个大于1的自然数(最小质数为2)。除了1和它自身外,不能被其他自然数整除的数。
=>质数:用n除[2,n-1]的所有数,不能整除就是n就是质数。
2.[2,n-1]缩小到[2,√n]效果相同
原因:判断一个n(n>1,自然数)是否是质数?
n=xy,x、y为整数,n=√n√n,此时就当x,y都等于√n,x取小于√n的某整数时,若能被n整除,得到y大于√n的某整数,也能被n整除,保持乘积还是n。x、y两个约数在√n两边。判断是否素数,需要n除[2,n-1]的所有数,使用√n分为[2,√n]和[√n,n-1],n在[2,√n]有约数,在[√n,n-1]也有约数,n在[2,√n]没有约数,在[√n,n-1]也没有约数。
其实只需要[2,√n]就能起到判断质数作用。
//求100000以内的质数?
class PrimeNumberTest {
public static void main(String[] args) {
//方法1
long start = System.currentTimeMillis(); //开始时间
for(int i = 2; i<=100000; i++){
if(i==2){
System.out.print(i+" ");
}
for(int j=2; j<=i-1; j++){
if(i % j != 0){//不能被整除
if(j != i-1){//不是最后一个数,继续遍历
continue;
}else{//是最后一个数
System.out.print(i+" ");
}
}else{//遍历过程中,只要有一个数能被整除,跳出内循环
break;
}
}
}
long end = System.currentTimeMillis(); //结束时间
System.out.println("消耗时间" + (end - start));
System.out.println();
//方法2(未优化)
long start1 = System.currentTimeMillis();
for(int i=2; i<=100000; i++){
boolean isFlag = true;
for(int j = 2; j<=i-1; j++){
if(i % j == 0){
isFlag = false;
}
}
if(isFlag == true){
System.out.print(i+" ");
}
}
long end1 = System.currentTimeMillis();
System.out.println("消耗时间" + (end1 - start1));
System.out.println();
//方法2(优化)
long start2 = System.currentTimeMillis();
for(int i=2; i<=100000; i++){
boolean isFlag = true;
for(int j = 2; j<=Math.sqrt(i); j++){//优化1,对质数。[2,这个数-1]->[2,√这个数]
if(i % j == 0){
isFlag = false;
break;//优化2,对非质数。在遍历是否整除过程中,只要出现整除的,立马终止循环,不除后续的数。
}
}
if(isFlag == true){
System.out.print(i+" ");
}
}
long end2 = System.currentTimeMillis();
System.out.println("消耗时间" + (end2 - start2));
System.out.println();
//方法3
long start3 = System.currentTimeMillis();
laber:for(int i=2; i<=100000; i++){//对这个for循环打个标签laber
for(int j = 2; j<=Math.sqrt(i); j++){
if(i % j == 0){
continue laber;//不是质数,结束外层for循环的当次循环(这个数不是质数换个数继续判断)
}
}
//执行到此处的都是质数
System.out.print(i+" ");
}
long end3 = System.currentTimeMillis();
System.out.println("消耗时间" + (end3 - start3));
}
}
方法1:
方法2(未优化):
方法2(优化):
方法3:
可以看出方法2(优化)执行效率最快。