时间开销:
100亿大小花了50.847535s
10亿大小花了5.761456s
因为boolean初始化是false,所以if那里判断不为真则执行(false则执行,true则跳过。PS:觉得不好看可以加一段初始化为true的代码)
for循环判断i的平方根小于数组最大的大小,因为i*i至i*2都算过了(与前面的2*i至i*i顺序相反)然后遍历数组。
判断质数才继续执行,不是质数的就没必要了,小的质数已经把后面的设置为true了(如果你把数组全设true,那么if就不要!,后面的设置false)
最后,把所有能被质数i与j++(实际上是从i开始)的倍数设置为true(非质数)。素数就出来了
对了,long是为了避免乘法溢出
boolean[] map=new boolean[100000000];
for (long i=2;i*i<map.length;i++)
if(!map[(int)i])
for(long j=i;j*i<map.length;j++)
map[(int)i*j]=true;
后续优化相关:
优化主要是节约存储空间。可以设想,所有的双数都不是质数,所有剔除所有的双数。
在存储的时候用(x-1)/2
在取出的时候用x*2+1
单独保留2就行了。
继续优化:因为boolean类型是占用1byte,但是它只需要1bit就能描述
所以可以用byte存储8个bit来压缩,使内存消耗降低7/8。