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.
浙公网安备 33010602011771号