作用:求出[2,N]内所有素数。
算法:每个合数必有一个素数因子,利用已知素数去筛除合数。
说明:因为答案数组是从1开始的,所以用binary_search( ) 、lower_bound( )和upper_bound( ) 函数不需要另行判断,但注意写法要均加1 ---------------(Ans_p+1,Ans_p+tot+1,x) 。
代码
时间复杂度:近似O(n)
输入:n 所需素数范围
输出:函数内部赋值于Ans_p数组
#include<iostream> #include<cstdio> #include<string.h> using namespace std; const int MaxN=1000010;//设置最大范围 bool flag[MaxN];//标记数组 int Ans_p[MaxN],tot;//素数表,总素数个数,注意(Ans_p[tot])内有素数 void eulgp(int n)//2~n 内的素数 { tot=0; //初始化 memset(flag,-1,sizeof(flag)); for(int i=2;i<=n;++i) { if(flag[i]) Ans_p[++tot]=i; //存入素数 for(int j=1;(j<=tot)&&(i*Ans_p[j]<=n);++j) { flag[i*Ans_p[j]]=0; if(i%Ans_p[j]==0) //避免重复赋0及时跳出 break; } } } int main() { int n,m,x; cin>>n>>m;//输入素数范围及需要判断的次数 eulgp(n); while(m--) { cin>>x; if(binary_search(Ans_p+1,Ans_p+tot+1,x))//此为STL二分函数判段有无, cout<<"Yes"<<endl; //有1,无0 else cout<<"No"<<endl; } return 0; }