1常规想法
遍历1-n中所有数字,如果是质数则输出
那该如何判断该数是不是质数呢?
假设有一个数x,它只能被1和本身整除,则这个数为质数,那就意味着2到x-1该数都不能整除,则这个数是质数此时可以使用循环来完成
def prime(n):
for i in range(2,n):
if n%i==0:
return False
return True
当然可以对上述代码进行优化,假设一个数y,满足y是x^0.5之后去除小数部分所得到的整数,那就意味着x如果是一个合数,则它的因子应该一个在y的左边和另一个在右边,或者是y本身,则不需要继续往y+1到x-1之间进行遍历
def prime(n):
for i in range(2,int(n**0.5)+1):
if n%i==0:
return False
return True
2素数筛
初始化一个数组vis,其大小为n+1,且内部元素全为0,从下标为2的元素开始遍历,如果vis[i]=0则它是一个素数,对其输出,且把vis[k*i]全部置1,其中2<=k<=n//i
def prime_sieve(n):
vis=[0]*(n+1)
vis[0]=vis[1]=1
prime=[]
for i in range(2,n+1):
if vis[i]==0:
prime.append(i)
for j in range(2*i,n+1,i):
vis[j]=1
return prime