歐拉篩法
阿新 • • 發佈:2018-04-01
urn AI ace earch cout bre ostream OS 復雜度
作用:求出[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; }
歐拉篩法