题目【筛素数】
参考题解
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())