AcWing 868. 筛质数python3
原题链接
简单
作者:
xanxus1111
,
2020-06-01 16:36:45
,
所有人可见
,
阅读 691
#朴素算法:把每一个数放到表里,从小到大,把所有的数的倍数删掉
#埃氏筛法
#时间复杂度,调和级数,O(nln n )
#简单的优化,只把质数的倍数删掉就可以
#质数定理。1~N中 有 N/lnN个质数
#优化后的复杂度为 O(NloglogN)
#线性筛法:把每个和数用它的某一个质因子筛掉 大概比埃氏筛法快一倍
# n只会被它的最小质因子筛掉
#1 i%primes[j] == 0
# primes[j] 一定是i的最小质因子,也一定是primes[j]*i的最小质因子
#2 i%primes[j] != 0
# primes[j] 一定小于i的所有质因子,也一定是primes[j]*i的最小质因子
def get_primes(x):
global n,cnt
for i in range(2,n+1):
if not st[i]:
primes[cnt] = i
cnt+=1
j = 0
while primes[j] <= n/i: #j是从小到大枚举的质数
st[primes[j]*i] = True #每一次把当前的质数和i的乘积筛掉
if i % primes[j] == 0:break #如果这句条件满足时,primes[j]一定是i的最小质因子
j+=1
if __name__=='__main__':
N = 1000010
n = int(input())
st = [False]*(N)
primes = [0]*(N)
cnt = 0
get_primes(n)
print(cnt)