筛质数
分析
- 定义全局变量:
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++代码
|
|