素数筛两种方法

#include <iostream>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=10005;
bool vis[maxn];
int prime[maxn];
void make_prime()//一般线性筛,会出现重复筛,每一次筛掉的是素数的倍数
{
    memset(vis,true,sizeof(vis));
    vis[0]=vis[1]=false;
    int tot=0;
    for(int i=2;i<maxn;i++)
    {
        if(vis[i])//表明i是素数
        {
            prime[++tot]=i;
            for(int j=i*i;j<maxn;j+=i)//将能够整除这个数的筛掉
                vis[j]=false;
        }
    }
}
void Euler_prime()//快速线性筛法,每一次筛掉的是i*(小于它最小素因子)的合数
{
    memset(vis,true,sizeof(vis));
    int tot=0;
    for(int i=2;i<maxn;i++)
    {
      if(vis[i]) prime[tot++]=i;
      for(int j=0;j<tot&&prime[j]*i<maxn;j++)//不管是不是素数都会进行这一步
      {
          vis[i*prime[j]]=false;
          if(i%prime[j]==0) break;//关键
      }
    }
}
int main()
{
    return 0;
}

原文地址:https://www.cnblogs.com/xuejianye/p/5667154.html