阿良的算法之路(线性筛筛素数)

题目【筛素数】

参考题解

1.埃氏筛法 O(nloglogn) 

n = int(input())

box = [False] * (n + 1)
primes = []

for i in range(2, n + 1):
    if not box[i]:            # 如果没有被筛过
        primes.append(i)
    
        for j in range(i + i, n + 1, i):
            box[j] = True

print(len(primes))

2.线性筛法 O(n)

def load_dataset():
    return int(input())


def linear_siere(n):
    st = [False for _ in range(n+1)] 
    primes = []
    for i in range(2, n + 1):
        if not st[i]: 
            primes.append(i)
        
        for p in primes:    # 遍历素数列表
            if p * i > n: break  # 如果 p*i 已经大于 n 了没必要再筛了  
            st[p*i] = True      # 满足条件筛掉 p/i
            if i % p == 0: break # i是p的倍数(即p是i的最小质因子),就不用再继续了
                                 #  换句话说,之前已经筛过一次了
                                 # 但是还是需要用最小质因子来筛的所以放在筛的式子的下面
    print(len(primes))

if __name__ == "__main__":
    linear_siere(load_dataset())

猜你喜欢

转载自blog.csdn.net/qq_51831335/article/details/121099480