//遍历100000以内的质数,并汇总个数,用时
public class Test2{
public static void main (String [ ] args){
long start = System.currentTimeMillis( ) ;//计算用时
int sum = 0 ;
for (int i=1 ; i<=100000 ; i++ ){
boolean flag = true ;//判断某个数是否属于质数 是否需要输出
for( int j = 2 ; j<i ; j++ ){
if( i%j==0 )
flag = false ; //判断某个数是否属于质数 是否需要输出
}
if( flag==true ){//判断某个数是否属于质数 是否需要输出
System.out.println( i ) ;
sum++ ;
}
}
long end = System.currentTimeMillis( ) ;//计算用时
System.out.println( "总数为"+ sum ) ;
System.out.println("总耗时为" + (end-start) + "ms") ;//计算用时
}
}
//作者笔记请忽略
/*public class Test2{
public static void main(String [ ] args ){
int i = 1 ;
for( ; i<=10 ; i++){}
System.out.print(i);//输出结果是11,for之外定义的 i 的值被for改变了
}
}*/
第一种方法,未优化,耗时很长
二.break优化
原理:for筛选循环一旦决定抛弃这个值,就应该立刻break,避免做无用功
public class Test2{
public static void main (String [ ] args){
long start = System.currentTimeMillis( ) ;
int sum = 0 ;
for (int i=1 ; i<=100000 ; i++ ){
boolean flag = true ;
for( int j = 2 ; j<i ; j++ ){
if( i%j==0 ) {
flag = false ;
/***********************************************/
/***********************************************/
break ;//跳出子循环,直接舍弃该值
/***********************************************/
/***********************************************/
}
}
if( flag==true ){
System.out.println( i ) ;
sum++ ;
}
}
long end = System.currentTimeMillis( ) ;
System.out.println( "总数为"+ sum ) ;
System.out.println("总耗时为" + (end-start) + "ms") ;
}
}
仅仅一个break语句,总耗时减少到未优化的十分之一
三.从数学层面对循环体优化
把for(int j = 1 ; j<i ;j++)改为for(int j = 1 ; j<=Math.sqrt(i) ; j++)
四.跳转语句
用continue label方法(goto)减少了代码量但是没有对程序执行效率有明显改变
public class Test2{
public static void main (String [ ] args){
long start = System.currentTimeMillis( ) ;
int sum = 0 ;
label : for (int i=1 ; i<=100000 ; i++ ){
for( int j = 2 ; j<Math.sqrt(i) ; j++ ){
if( i%j==0 ) {
continue label ;//
}
}
//能执行到这一步的都是质数
System.out.println(i);
sum++ ;
}
long end = System.currentTimeMillis( ) ;
System.out.println( "总数为"+ sum ) ;
System.out.println("总耗时为" + (end-start) + "ms") ;
}
}
执行用时仍然为419ms
虽然此处看着用时只比第二种减少了四分之三,但是这个程序耗时大部分是由于输出语句,而不是运算语句,实际上对程序执行效率影响最大的就是这个数学层面的优化。可以把输出语句System.out.println( i ) ;去掉然后再对比一下三种方法耗时。第三种方法的优化影响尤其大~