求素数
线性筛(欧拉筛)
线性筛时间复杂度是线性的O(n);
他是从埃氏筛改进而来的,理解线性筛我们需要先对上面的埃氏筛的原理有了解。
线性筛是遍历乘数来枚举质因数筛除,
这里的i不只是质数,而是未被标记的乘数,当然当枚举到的时候如果该乘数还没有被筛掉(没被标记)那么他就是质数(更不会被比自己大的数筛掉了)
不论是否被标记都作为乘数需要来和质数列中的质数乘,筛去更大的数
如4虽然被标记了,但他仍要和2相乘筛去8,但不用和3成了,12考2*6筛去
2,3 4 5 6 7 8 9 10 11 12 13 14 15
pr=[0 for i in range(1000)]
v=[0 for i in range(1000)]
def Prime(n):
global pr,v
#0,1略过了
cnt=0
for i in range(2,n+1):
if not v[i]:
# pr.append(i)
# cnt+=1
pr[0]+=1
pr[pr[0]]=i
for j in range(1,pr[0]+1):
if pr[j]>n/i:
break
v[i*pr[j]]=1
if i%pr[j]==0:
break
Prime(30)
print(pr[0])
for i in range(1,pr[0]+1):
print(pr[i])

浙公网安备 33010602011771号