遍历质数并优化,100000以内的质数

//遍历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 ) ;去掉然后再对比一下三种方法耗时。第三种方法的优化影响尤其大~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值