目录
前言:博主不是计科专业,可能会有错误,欢迎指正。 这个质数筛法真的十分简单,不要害怕,一口就学了不要拖沓。一开始我认为会很难,不敢学习,后来被逼无奈,学习之后发现你只要鼓起勇气去学习就很简单。 然后看见网上其他博主写的筛法感觉好墨迹啊而且文章半天进入不到重点。然后就想自己写篇文章。
常规筛法:
代码如下:
from math import sqrt
def hanshu(n):
for i in range(2,int(sqrt(n))+1):
if n%i==0:
return False
return True
print(hanshu(100))
代码输出:
False
注释:这个就没啥要说的了吧。
埃式筛法:
代码如下:
from math import sqrt
def hanshu(n):
ls,x,y=[True]*(n+1),2,int(sqrt(n))+1
while x<y:
for i in range(x*2,n+1,x):
ls[i]=False
x+=1
ls=[i for i in range(2,n+1) if ls[i]==True]
return ls
print(hanshu(100))
代码输出:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
注释:先创造一个含有(n+1)个元素的列表,标记它们全为质数。把下标为 2 的倍数列表元素标记为非质数(1倍除外),把下标为 3 的倍数列表元素标记为非质数(1倍除外),……,把下标为 int(sqrt(n)) 的倍数列表元素标记为非质数(1倍除外)。结束。
欧拉筛法:
代码如下:
from math import sqrt
def hanshu(n):
ls,x,y=[True]*(n+1),2,int(sqrt(n))+1
while x<y:
if ls[x]==True:
for i in range(x*2,n+1,x):
ls[i]=False
x+=1
ls=[i for i in range(2,n+1) if ls[i]==True]
return ls
print(hanshu(100))
代码输出:
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
注释:你自己想想啊。2的时候已经去掉了2的倍数,4的时候还要去掉4的倍数,这一步是不是很多余。所以欧拉筛法就是在埃式筛法的基础上加一句话 if ls[x]==True:
。
后记:好了,OVER,是不是很简单很粗暴。不太喜欢废话连篇。认为有用的话点个赞吧
最后插几句吧,读者不感兴趣的话直接可走。
我在洛谷做过一道题,当时欧拉筛法内存超限(当然也可能是我太菜了,这道题其他的部分算法不好导致内存超限,我也没有具体深究),所以写了个低端一点但是不太占用内存的欧拉筛法。当然,时间也上去了。代码如下:
from math import sqrt
def hanshu1(n):
for i in range(2,int(sqrt(n))+1):
if n%i==0:
return False
else:
return True
def hanshu2(n):
m,ls=3,[2]
while m<=n:
for i in ls:
if m%i==0:
m+=1
break
else:
if hanshu1(m)==True:
ls.append(m)
m+=1
return ls
拜拜