[ TEMPLATE ] 埃氏筛

算法描述

要得到自然数n以内的全部素数,必须把不大于
√n的所有素数的倍数剔除,剩下的就是素数。
给出要晒数值的范围n,找出以内的素数。

先用2去筛,把2标记为素数,并把2的倍数剔除;
用3去筛,把3标记为素数,并把3的倍数剔除;

考虑一下,此时遍历到4,并且4已经被用2筛的时候给筛掉了,所以就跳过。
用5去筛,把5标记为素数,并把5的倍数剔除;
···
不断重复下去
对于可以枚举到的最小数(因为是从2开始向后枚举)
因此不用担心枚举到i时,它不是素数。
vis[i]表示i是否是素数

模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<bits/stdc++.h>
using namespace std;
const int maxn=100000;
int vis[maxn];
void Eratosthenes(int n){//给定n的范围
int len=sqrt(n+0.5);//避免误差
for(int i=2;i<=len;i++){
if(!vis[i]){//当前用来筛的数是素数
for(int j=i+i;j<=n;j+=i){
vis[j]=1;
}
}
}
}
Author: universal42
Link: https://universal4s.github.io/2019/02/19/eratosthenes/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.