埃氏筛&欧拉筛(也叫线性筛) 算法思路、示例、实现

埃氏筛

思想:
  • 要得到自然数n以内的全部素数,必须把不大于 的所有素数的倍数剔除,剩下的就是素数。
  • 给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去…。
# 初始化一个列表a,从1到n-1
# 从2开始,直到int(n**(0.5)+1)为止:x
#     去掉a中所有x的倍数
# 最后统计出a中有多少个数即为结果
n=10
a=[i for i in range(2,n)]
for x in range(2,int(n**(0.5)+1)):
    m=2
    while m*x<=(n-1):
        try:
            a.remove(m*x)
        except:
            pass
        m+=1
print(a)

欧拉筛

思想:
  • 要得到自然数n以内的全部素数,必须把不大于 的所有素数的倍数剔除,剩下的就是素数。
  • 给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去…。
# 欧拉筛
# 建立一个数组用来存数
# 再建立一个数组用来存是否素数,都为1,和上面的数组一一对应
# 再建立一个空数组用来存素数
# 从2开始当该数的素数标记为1时,放入素数数组
# 再从素数数组开始遍历,和当前值进行求积,然后把第[积的数值]个数的素数标记变成0,要是之后发现当前数能被当前素数整除,则break
n=16
data=[i for i in range(0,n)]
flag=[1]*n
single=[]
for i in range(2,n):
    if flag[i]==1:
        single.append(data[i])
    for ii in range(len(single)):
        if single[ii]*i<n:
            flag[single[ii]*i]=0
        if i%single[ii]==0:
            break
print(data)
print(flag)
print(single)

欧拉筛的核心在于————
在这里插入图片描述
在这里插入图片描述

over.

要是还看不懂,下一篇博客我会介绍核心if i%single[ii]==0:break如何理解,直接上推导了。谢谢朋友们。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值