线性筛

# 求 1 ~ n 所有的质数【线性筛,也叫欧拉筛,时间复杂度为O(n),埃氏筛为O(nlogn)】
n = int(input())
prime = []
vis = [0] * (n + 1)
# 合数 = 最小质因子 × k (最大且不等于它自身的因数)
# 每个合数必有一个【最小素因子】或【最大因子】
for i in range(2,n + 1):
    if not vis[i]:
        prime.append(i)
    for x in prime:
        if x * i > n:
            break
        vis[x * i] = 1
        # 这里的x必须是x * i 的最小质因子!
        if i % x == 0:
            break

print(len(prime))
posted @ 2024-04-02 21:18  gebeng  阅读(26)  评论(0)    收藏  举报