复杂度为nlogn。
算法思想为:枚举1~sqrt(n),然后把每一个数的倍数都都打上不是素数的标记。
还要特别注意0,1不是素数,打标记枚举到i*k<=n.
代码如下
#include<bits/stdc++.h> #define maxn 10000001 using namespace std; bool prime[maxn]; int n,m; void make_prime() { memset(prime,true,sizeof(prime)); prime[0]=prime[1]=false;//0,1都不是素数 int t=sqrt(n);//开根号 for(int i=2;i<=t;i++) { if(prime[i]) { for(int j=2*i;j<=n;j+=i)//加倍 { prime[j]=false; } } } return; } int main(){ cin>>n>>m; make_prime(); for(int i=1,x;i<=m;i++){ cin>>x; if(x==0||x==1) cout<<"No"<<endl; else if(prime[x]==true) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }