今天回顾Java的时候回忆起的一个比较不错的一道算法知识点
下面将逐步优化质数的判断算法
1、基础方法
class PrimeNumberTest1{
public static void main(String[] args){
long start = System.currentTimeMillis();
for(int i=2;i<=10000;i++){
//标识i是否被j除尽,一旦除尽修改其值
//放在第一层for内可保证在循环结束时重置isFlag的值
boolean isFlag = true;
for(int j=2;j<i;j++){
if(i%j==0){
isFlag = flase;
}
}
if(isFlag == true){
System.out.println(i);
}
}
long end = System.currentTimeMillis();
long spTime = end-start;//运行时间
}
}
2、第一步优化:添加break
class PrimeNumberTest1{
public static void main(String[] args){
long start = System.currentTimeMillis();
for(int i=2;i<=10000;i++){
//标识i是否被j除尽,一旦除尽修改其值
//放在第一层for内可保证在循环结束时重置isFlag的值
boolean isFlag = true;
for(int j=2;j<i;j++){
if(i%j==0){
isFlag = flase;
break;//优化1:只对本身非质数的自然数是有效的
}
}
if(isFlag == true){
System.out.println(i);
}
}
long end = System.currentTimeMillis();
long spTime = end-start;//运行时间
}
}
3、缩小j的遍历范围
class PrimeNumberTest1{
public static void main(String[] args){
for(int i=2;i<=10000;i++){
//标识i是否被j除尽,一旦除尽修改其值
//放在第一层for内可保证在循环结束时重置isFlag的值
boolean isFlag = true;
/*
对本身是质数的自然数是有效的
原理:如果一个数是质数,那么一定可以表示为□×△的形式
那么□和△中肯定有一个是偏小的或者是二者相等的
那么我们只需要判断能否在这个相等时候的中间值之前
是否可以整除即可,这个中间值即为i的开方
*/
for(int j=2;j<=Math.sqrt(i);j++){
if(i%j==0){
isFlag = flase;
break;//优化1:只对本身非质数的自然数是有效的
}
}
if(isFlag == true){
System.out.println(i);
}
}
}
}