筛选质数方法

时间开销:

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值