我们知道计算机去执行算法是需要时间的,小数以内的时间我们可能不会觉得慢,但是在大繁琐的程序中还是会觉得很慢的;
下面我们看一下输出100000以内的质数如何实现优化的一个过程:
首先我们看一个可以实现输出质数的程序:
public static void main(String[] args) {
boolean flag=false;
long start=System.currentTimeMillis();//系统输出的一个时间毫秒为单位
for(int i=2;i<=100000;i++){
for(int j=2;j<i;j++){
if(i%j==0){
flag=true;
}
}
if(flag==false){
System.out.println(i);
}
flag=false;
}
long end=System.currentTimeMillis();//系统输出的一个时间毫秒为单位
System.out.println(end-start);//14391这是输出的时间
}
这个程序输出时间为14391毫秒,那么可以感觉出这个不算快,我们还有更好的办法吗?
上面可以看出第二个循环在i%j的时间就算能够知道不是质数的情况 下还在继续和其他数作取模;比如6取模2不是质数,但是6还会去取模3,4,5;所以程序执行了一些不必要的东西;
下面看一下优化后的程序
public static void main(String[] args) {
boolean flag=false;
long start=System.currentTimeMillis();
for(int i=2;i<=100000;i++){
for(int j=2;j<i;j++){
if(i%j==0){
flag=true;
break;
}
}
if(flag==false){
System.out.println(i);
}
flag=false;
}
long end=System.currentTimeMillis();
System.out.println(end-start);//1281
}
看一下这个变动并不大,但是起到的作用非常大,加了break;如果不是质数就跳出此循环了;还是可以节省很多时间的;那么有没有更快的呢?
public static void main(String[] args) {
boolean flag=false;
long start=System.currentTimeMillis();
for(int i=2;i<=100000;i++){
for(int j=2;j<Math.sqrt(i);j++){
if(i%j==0){
flag=true;
break;
}
}
if(flag==false){
System.out.println(i);
}
flag=false;
}
long end=System.currentTimeMillis();
System.out.println(end-start);//76
}
看一下这个又节省了将近一半的时间,所以还是很不错的,这里是在循环中加了方法Math.qrat(i)代表根号的意思,这样程序又会节省很多不必要的运算;
还有一种方法:
public static void main(String[] args) {
long start=System.currentTimeMillis();
lable:for(int i=2;i<=100000;i++){
for(int j=2;j<Math.sqrt(i);j++){
if(i%j==0){
continue lable;
}
}
System.out.println(i);
}
long end=System.currentTimeMillis();
System.out.println(end-start);//63
}