求素数

线性筛(欧拉筛)

线性筛时间复杂度是线性的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])
posted @ 2022-06-04 11:26  束时  阅读(62)  评论(0)    收藏  举报