输出100以内所有的质数

效率比较低的算法

        //放在外面减少了变量的创建
        boolean isFlag = true;

        //遍历10000以内的自然数
        for (int i = 2;i <= 100000; i++) {
            for (int j = 2; j < i;j++){ //j:被i去除
                if (i % j == 0){//i被除尽,说明不是质数
                    isFlag = false;
                    //优化一
//                    break;
                }
            }
            if(isFlag){
                System.out.println(i);
            }
            //重置变量
            isFlag = true;
        }

 

不妨将数据范围扩大到100000,记录一下执行时间

        //放在外面减少了变量的创建
        boolean isFlag = true;
        long start = System.currentTimeMillis();
        //遍历10000以内的自然数
        for (int i = 2;i <= 100000; i++) {
            for (int j = 2; j < i;j++){ //j:被i去除
                if (i % j == 0){//i被除尽,说明不是质数
                    isFlag = false;

                }
            }
            if(isFlag){
                System.out.println(i);
            }
            //重置变量
            isFlag = true;
        }

        long end = System.currentTimeMillis();
        System.out.println("用时" + (end - start));

用时25607。

给这个程序添加优化

当我找到一个可以被除尽的数后就已经说明这个数不是质数了,跳出循环

        //放在外面减少了变量的创建
        boolean isFlag = true;
        long start = System.currentTimeMillis();
        //遍历10000以内的自然数
        for (int i = 2;i <= 100000; i++) {
            for (int j = 2; j < i;j++){ //j:被i去除
                if (i % j == 0){//i被除尽,说明不是质数
                    isFlag = false;
                    //优化一
                    break;
                }
            }
            if(isFlag){
                System.out.println(i);
            }
            //重置变量
            isFlag = true;
        }

        long end = System.currentTimeMillis();
        System.out.println("用时" + (end - start));

用时25607----> 用时3512

        //放在外面减少了变量的创建
        boolean isFlag = true;
        long start = System.currentTimeMillis();
        //遍历10000以内的自然数
        for (int i = 2;i <= 100000; i++) {
            //优化二: j < i  -- j < Math.sqrt(i)
            for (int j = 2; j < Math.sqrt(i);j++){ //j:被i去除
             ...
             ...
        System.out.println("用时" + (end - start));

用时25607----> 用时3512---->用时314

这里打印语句缩短了性能,

解除封印

        //放在外面减少了变量的创建
        boolean isFlag = true;
        int count = 0;
        long start = System.currentTimeMillis();
        //遍历10000以内的自然数
        for (int i = 2;i <= 100000; i++) {
            //优化二: j < i  -- j < Math.sqrt(i)
            for (int j = 2; j < Math.sqrt(i);j++){ //j:被i去除
                if (i % j == 0){//i被除尽,说明不是质数
                    isFlag = false;
                    //优化一
                    break;
                }
            }
            if(isFlag){
                count++;
                //System.out.println(i);
            }
            //重置变量
            isFlag = true;
        }

        long end = System.currentTimeMillis();
        System.out.println("共有"+count +"个质数,用时" + (end - start));

共有9657个质数,用时33

 

总结: 优化方式一:是针对非质数所作的优化

优化方式二:对质数和非质数都有效,不过这里非质数的情况被方式一做了,所以这里是对质数所作的优化

解释一下: 为什么是  j<根号i

输出100以内所有的质数_第1张图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(java)