素数朴素判定
素数的定义
在大于1的自然数中,除了1和它本身以外不再有其他的因数的自然数。
素数x的因数只有1和x。
朴素判定
从1到x-1枚举,判断每一个数是不是因数。
def is_prime(x):
if x<=1:
return False
for i in range(2,x):
if x%i==0:
return False
return True
时间优化
若x=pq,则一定有一个比x的平方根大,一个比x的平方根小。
如此,只要x的左半部分没有因数,右半部分也就没有因数。
因此,只要判断一边就好。
n=int(input())
def is_prime(x):
if x<=1:
return False
m=int(x**0.5)
for i in range(2,m+1):
if x%i==0:
return False
return True
埃式筛法
当你找到了一个质数,就把它的倍数全部删除。如图所示。
def get_prime(n):
#给每个点打标记,表示是否从素数行列中删除
vis=[0]*(n+1)
vis[0],vis[1]=1,1
prime=[]
#从小到大,遇到的第一个没有被标记的就是质数
for i in range(2,n+1):
if vis[i]==0:
prime.append(i)
#标记质数的所有倍数
for j in range(i*2,n+1,i):
vis[j]=1
return prime