素数的筛选
如果用传统的筛遇到大数很容易超时,所以通过一些限制条件筛掉非素数
传统筛选模板:
def is_prime(i):
if x==0 or x==1:
return 0
for i in range(2,int(x**0.5)+1):
if x%i==0:
return 0
return 1
下面介绍筛选方法中的埃氏筛
埃氏筛的思路不是找素数,而是去非素数
通过遍历到的i再把i的倍数全部去掉,以此达到只存在素数的效果
例:筛选1~N-1之间的素数
N=int(1e6)#一般最大可以用到1e6,1e7会超过内存
prime=[0]*N
vis=[0]*N
def E_sieve(x):
for i in range(2,int((x**0.5)+1)):
if not vis[i]:#如果没被筛过
for j in range(i*i,n+1,i):
vis[j]=1#标记
k=0
for i in range(2,n):
if not vis[i]:
prime[k]=i
k+=1
return k
n=int(input())
k=E_sieve(n-1)
for i in range(0,k):
print(prime[i],end=' ')
print()
print(k)