线性筛
Start.
线性筛它是用来筛选出1-n之内的素数,它的时间复杂接近于O(n)。
它的大致过程是:使用一个长度为 n 的bool数组,刚开始都是未被标记的,从2开始找,将所有合数标记为true(筛选掉合数),没有被标记的就是素数。
而筛选合数的核心思想就是:所有合数都将被它的最小质因子筛掉。
细节:有一个知识点,对于所有的合数,它的最小质因子是唯一的,所以每个合数都有唯一的这样的形式:
合数=最小质因子* i(最小质因子的 i 倍 = 这个合数)
所以对于2-n中的每一个数 i , 都使用 i 与 i 之前的素数 相乘 得到应该被筛选掉的合数。
typedef long long ll;
const int N=10002;
bool vis[N]; //标记数组,true表示是合数,false是素数
int ans[N]; //存储得到的素数
int tot;
void getPirme(int n){
for(int i=2;i<=n;i++){
if(!vis[i]){ //没有被标记的为素数
an