【模板】埃式筛和欧拉筛(线性筛)

埃式筛:

基本思想:

从2开始,将每个质数的倍数都标记成合数,以达到筛选素数的目的

代码模板:

//如果为素数,则对应位置为1
void Prime(){
    for(int i = 2; i <= n;i++){
        is_prime[i] = 1;
    }
    for(int i = 2; i <= n; i++){
        if(is_prime[i]){
            for(int j = 2; i*j <= n; j++){
                is_prime[i*j] = 0;
            }
        }
    }
}

 

 

欧拉筛(线性筛)

在埃式筛的基础上,让每个合数只被它的最小质因子筛选一次,达到不重复目的

int prime[1100000],primesize;
bool isprime[11000000];
void Prime(int listsize)
{
    memset(isprime,1,sizeof(isprime));
    isprime[1]=false;
    for(int i=2;i<=listsize;i++)
    {
        if(isprime[i])prime[++primesize]=i;
         for(int j=1;j<=primesize&&i*prime[j]<=listsize;j++)
         {
            isprime[i*prime[j]]=false;
            if(i%prime[j]==0)break;
        }
    }
}
//筛选出来的数存放在prime数组中,从下标1开始

 

posted @ 2020-12-06 14:37  我不秃  阅读(146)  评论(0)    收藏  举报