筛质数
分析
- 定义全局变量:
primes[N]
:存储所有筛出的质数st[N]
:标记每个数是否为合数(true
表示不是质数)cnt
:统计质数数量
- 线性筛法(每个合数只会被它的最小质因子筛去一次)
- 遍历
i
从2
到n
- 如果
st[i] == false
,说明i
是质数,记录到primes[cnt ++ ]
- 枚举当前已记录的质数
primes[j]
- 将
primes[j] * i
标记为合数 - 如果
i % primes[j] == 0
,说明primes[j]
是i
的最小质因子,直接break
,防止重复标记primes[j]
是i
的最小质因子- 那么
primes[j] * i
的最小质因子仍然是primes[j]
- 如果继续用后面的
primes[k]
去乘i
,生成的primes[k] * i
这个合数,其最小质因子可能不是primes[k]
,而是primes[j]
,违背线性筛只由最小质因子筛的原则
- 将
- 遍历
时间复杂度
时间复杂度 O(n)
空间复杂度
空间复杂度 O(n)
C++代码
|
|