其他分享
首页 > 其他分享> > 统计找出一千万以内,一共有多少质数?(优化过程,效率更快)

统计找出一千万以内,一共有多少质数?(优化过程,效率更快)

作者:互联网

质数概念: 只能被1和自己整除的数

**

初步思路

**:运用双层循环,判断是否为质数,true则num+1;false跳过

代码如下:

package somethings;

import java.util.Locale;

/**
 * @author  Small_Tsky
 * @date 2020/2/23 - 16:21
 **/
public class Unimportance {

    public static void main(String[] args) {

        long start = System.currentTimeMillis();
        int n = 10000000;
//        初始化num (因为1和2都为质数未被计入for循环里)
        int num = 2;

        for (int i = 3; i <= n; i++) {
            for (int j = 2; j <i ; j++) {
//                i除1和本身没有其他的因子,即为质数
                if (i % j != 0) {
                    num++;
                }
            }
        }

        System.out.println("一千万以内的质数个数为:"+num);
        long end = System.currentTimeMillis();
        System.out.println("所用时间:"+(edn - start)+"毫秒");
    }
}

运行结果: 无

数据过于庞大,运算次数要循环**1+2+…+(10000000-2)**次。

-----------------------------------------------------------------------

下面就要优化优化思路,不能蛮干了:

优化思路:

对与确定的质数先做标记,标记完成后,遍历标记的质数,num++;

代码如下:

import java.util.Arrays;

/**
 * @author Small_Tsky
 * @date 2020/2/23 - 16:25
 **/
    public class Isprimes {
            public static void main(String[] args) {
                long start = System.currentTimeMillis();
                int n = 10000000;
                int num = 0;
                boolean [] isprimes = new boolean[n];
//                定义isprimes[]
                Arrays.fill(isprimes,true);
                for (int i = 2; i <= isprimes.length; i++) {
                    for (int j = 2; i * j < isprimes.length; j++) {
//                        标记不符合条件的num,即有因子的全部标记false;
                        isprimes[i * j] = false;
                    }
                }
                isprimes[0]=false;
//                  遍历isprimes[]
                for (int i = 0; i <isprimes.length ; i++) {
                    if (isprimes[i]){
                        num++;
                    }
                }
                 long end = System.currentTimeMillis();
        System.out.println("一千万以内的质数一共有 " + num + " 个");
        System.out.println("所用时间为 " + (int) (end - start)+"毫秒");
}
}

运行结果:


一千万以内的质数一共有 664580 个
所用时间为 2132毫秒

Process finished with exit code 0

-----------------------------------------------------------------------

前辈思路(埃氏筛法):

代码如下:

package arrylist;

import property.Item;

import java.util.Arrays;

/**
 * @author Small_Tsky
 * @date 2020/2/23 - 16:30
 **/
public class list  {

    public static void main(String[] args) {
    long start = System.currentTimeMillis();
    int n = 10000000;
    boolean[] data = new boolean[n];
        Arrays.fill(data, true);
        for (int i = 1; i <= data.length; i++) {
        if(i%2==0) {
            data[i-1] = false;
        }
    }
    data[1] = true;
    //先把除了2之外的偶数全部确定为合数
    int num = 0;
    data[0] = false;
        for (int i = 2; i <= Math.sqrt(n); i++) {
        if (data[i - 1]) {
//            这里的步长改为2*i,跳过偶数部分
            for (int j = i * i; j <= n; j += 2 * i) {
                data[j - 1] = false;
            }
        }
    }
        for (int i = 0; i < data.length; i++) {
        if (data[i]) {
            num++;
        }
    }
    long end = System.currentTimeMillis();
        System.out.println("一千万以内的质数一共有 " + num + " 个");
        System.out.println("所用时间为 " + (int) (end - start)+"毫秒");
}
}

运行结果:

一千万以内的质数一共有 664579 个
所用时间为 186毫秒

#第三种结果比第二种结果足足快了2000多毫秒#

Tom Z 发布了1 篇原创文章 · 获赞 0 · 访问量 43 私信 关注

标签:找出,10000000,int,质数,一千万,num,import,public
来源: https://blog.csdn.net/Small_Tsky/article/details/104479692