欧拉筛

1.相关定理:任何一个数都会被其最小质因子筛掉。

例如: 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17等等。
接下来每个乘法算式等号左边第一个数是质数的倍数。
(1)最开始2判定为质数,2×2=4,4被他的最小质因子2筛掉,2%2= =0,退出循环。
(2)之后是3判定为质数,3×2=6,3×3=9被筛掉,同理6,9分别被最小质因子2,3筛掉,3%3= =0。
(3)之后到4,4×2=8,4×3=12。(正常埃氏筛应该是这样),但没筛掉12的原因是12应该被2筛掉,而不是被3,否则之后会重复筛掉12。6×2=12,12应该是倍数i=6的时候,被最小质因子2筛掉。
(4)之后到5判定为质数,5×2=10,5×3=15,5×5=25。5%5= =0。
(5)之后到6,6×2=12,6%2= =0,退出循环.
(6)之后到7判定为质数,7×2=14,7×3=21,7×5=35。

2.i%prime[ j ]==0就退出还有一点(cnt足够大的前提下),就是当i为质数时第一次触发一定是i等于prime[ j ],先执行v[ i×prime[ j ] ]再退出的原因就是此次平方数的最小质因子是相等的,且仍满足被筛的条件(被其最小质因子筛掉),比如4=2×2,此时为边界情况。

for(int i=2; i<=n; i++){
    if(!v[i])prime[cnt++]=i;
    for(int j=0; j<cnt&&i*prime[j]<=n; j++){
        v[i*prime[j]]=1; 
        if(i%prime[j]==0)break;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值