AcWing 868. 筛质数
原题链接
简单
作者:
生日快乐
,
2021-02-18 13:57:31
,
所有人可见
,
阅读 258
n = int(input())
vis = [0] * 1000010
primes = [0] * 1000010
##cnt = 0
##
##for i in range(2, n+1):
## if vis[i] == 0:
## flag = i
## cnt += 1
## while flag * i <= n: vis[flag * i] = 1; flag += 1;
##
##print(cnt)
#线形筛
'''
if i % primes[j] == 0: break
我们希望每个合数被最小质因子筛除
break的原因是此时pj是i的最小质因子,那么下一个pj*i筛的合数的最小质因子一定不是pj
'''
cnt = 0
for i in range(2, n+1):
if not vis[i]:
cnt += 1
primes[cnt] = i
for j in range(1, cnt+1):
if primes[j] > n//i: break
vis[primes[j] * i] = 1
if i % primes[j] == 0: break
print(cnt)