以前判断素数都是用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; } } }