Java实现100000以内的质数的输出的优化过程

我们知道计算机去执行算法是需要时间的,小数以内的时间我们可能不会觉得慢,但是在大繁琐的程序中还是会觉得很慢的;

下面我们看一下输出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
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值