埃氏筛
思想:
- 要得到自然数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如何理解,直接上推导了。谢谢朋友们。