埃氏筛质数判定

从 2 开始,将每个质数的倍数都标记为非质数,最终剩下未被标记的就是质数。 举例说明(筛选 2~30 的质数):

  1. 初始时,默认 2~30 全部为质数。
  2. 2 是质数,标记 2 的所有倍数(4, 6, 8…)不是质数。
  3. 找到下一个未被标记的数:3,是质数,标记 3 的倍数(6, 9, 12…)不是质数。
  4. 接着是 5、7……依此类推,直到 $\sqrt30$ ≈ 5 为止。
1
2
3
4
5
6
7
8
bool not_prime[N];  // true表示不是质数,false表示质数,默认全是质数
void init(int n) { // 埃氏筛标记 0~n
not_prime[0] = not_prime[1] = true;
for(int i = 2; i <= sqrt(n); i++)
if(!not_prime[i])
for(int j = i * 2; j <= n; j += i)
not_prime[j] = true;
}
1
2
3
4
5
6
7
8
9
正式课:51*24=1224
直播课:7*180=1260
正常补课:4*100+2*24+2*24=496
插班补课:2*100=200
集训补课:1*300=300
预热课:6*96=576
体验课:5*100=500
清华附:1*400=400
1224+1260+496+200+300+576+500+400=4956

埃氏筛质数判定
https://zhubaoduo.com/2022/03/24/C++与算法/基础算法/埃氏筛指数判定/埃氏筛质数判定/
作者
baoduozhu
发布于
2022年3月24日
许可协议