埃氏篩法(求n以內有多少個素數)
阿新 • • 發佈:2018-08-06
cin algorithm memset fin lse mod pre 判斷 end
題目大意:給定整數n,請問n以內有多少個素數
思路:想必要判斷一個數是否是素數,大家都會了,並且可以在O(根號n)的復雜度求出答案,那麽求n以內的素數呢,那樣求就顯得有點復雜了,下面看一下這裏介紹的??氏算法
其實呢,就是求出第一個素數,然後把n以內它的倍數都刪掉就行了,很簡單。然後找下一個素數,同樣方法·····
看代碼
#include<iostream> #include<string.h> #include<map> #include<cstdio> #include<cstring> #include<stdio.h> #include<cmath> #include<math.h> #include<algorithm> #include<set> #include<queue> typedef long long ll; using namespace std; const ll mod=1e9+7; const int maxn=1e6+10; const int maxk=5e3+10; const int maxx=1e4+10; const ll maxe=1000+10; #define INF 0x3f3f3f3f3f3f #define Lson l,mid,rt<<1 #defineRson mid+1,r,rt<<1|1 int n; int prime[maxn]; bool is_prime[maxn]; void solve() { int sum=0; memset(is_prime,false,sizeof(is_prime)); is_prime[0]=is_prime[1]=true; for(int i=2;i<=n;i++) { if(!is_prime[i]) { prime[sum++]=i; for(int j=i*2;j<=n;j+=i) { is_prime[j]=true; } } } cout<<sum<<endl; } int main() { cin>>n; solve(); return 0; }
埃氏篩法(求n以內有多少個素數)