素数线性筛学习

以前判断素数都是用O(sqrt(n))的方法来做,当数字很大的时候用时会很高,所以这里用到了另一种方法,线性筛。顾名思义,筛掉一部分数。

普通做法:当找到一个素数之后,任何一个数乘上这个数字都是合数,筛掉所有的合数就行。

int prime[N];
int n,m,test,j,ask,cut,i;
int Noprime[N];
void isprime()
{
    cut=1;
    prime[1]=2;//初始化,第一个质数为2
    Noprime[1]=1;//初始化,1为合数
    for(i=2;i<=n;i++){    
        if(Noprime[i]==0){
            prime[cut]=i;//如果是质数,添加到质数表
            cut++;
        }

        for(j=1;j<=n && prime[i]<=i && i*prime[j]<=n;j++){//前提限制为p<i,i*p<n
            Noprime[i*prime[j]]=1;//筛合数
            if(i % prime[j]==0)
  {//该最大因子i已枚举完毕
                break;
            }
        }

    }
    for(i=1;i<=m;i++){
        cin>>ask;

        if(Noprime[ask]==0){
            cout<<"Yes"<<endl;
        }else{
            cout<<"No"<<endl;
        }
    }
}

 

posted @ 2018-08-01 16:46  TheSilverMoon  阅读(160)  评论(0编辑  收藏  举报