Java练习:统计Integer整数范围内质数个数、总和

用普通除法,单线程需要半小时;

用普通除法,多线程需要几分钟;

利用BitSet、筛法,仅需十几多秒,代码如下:

 

import java.util.BitSet;

public class Main {
    public static void main(String[] args) {
        long t0 = System.currentTimeMillis();
        final int MAX_INT = Integer.MAX_VALUE;
        BitSet bitset = new BitSet(MAX_INT);
        //bitset.clear();  //默认都是false,不需要clear
        bitset.set(0);  //0不是质数
        bitset.set(1);  //1不是质数
        for (int i=4; i>0; i+=2){  //去除2以外的偶数。i超出范围变成负数,所以用i>0
            bitset.set(i);
        }

        int prime = 3;  //从质数3的倍数开始,筛除合数
        int limit = 2 + (int)(Math.sqrt(MAX_INT));  //Integer.MAX_VALUE范围内,最大的因数
        int index = 3;
        while (prime < limit){
            int step = prime * 2;  //只管单数的倍数、所以步长为2倍,只管够大的倍数,从prime * prime开始
            for (index = prime * prime; index>0; index += step) {
                bitset.set(index);  //合数
            }
            prime = bitset.nextClearBit(++prime);  //找下一个质数
        }

        //把2预先放入初始值,从3开始统计
        long sum = 2L;
        int counter = 1;
        for (index = 3; index > 0; index += 2) {
            if (! bitset.get(index)) {
                ++counter;
                sum += index;
            }
        }

        long t1 = System.currentTimeMillis();
        System.out.println("质数个数:" + counter);
        System.out.println("质数总和:" + sum);
        System.out.println("计算耗时:" + (t1-t0)/1000.0 + " seconds.");
    }
}

 

 

运行结果:

质数个数:105097565

质数总和:109930816131860852

计算耗时:17.305 seconds.

posted @ 2021-02-27 18:38  我的成功之路  阅读(168)  评论(1)    收藏  举报