ACM_哥德巴赫猜想(素數篩)
阿新 • • 發佈:2018-06-25
ont other turn desc 簡單 rim 全部 == pan
哥德巴赫猜想
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
哥德巴赫猜想大概是這麽一回事:“偶數(>=4) == 兩個質數的和”,至於是不是、成不成立,隨它吧。
Input:
多組數據,每組一個偶數n(4<=n<=10^6)
Output:
若能分解則輸出這兩個質數,若有多解則按小數優先規則輸出全部解,若無解則輸出"No";
Sample Input:
16
Sample Output:
3 13 5 11
解題思路:簡單的素數篩:歐拉篩法(線性篩法),時間復雜度是O(n)。
AC代碼:
1 #include<bits/stdc++.h> 2using namespace std; 3 const int maxn=1e6+5; 4 int n,cnt=0,prime[maxn];bool flag,isprime[maxn]; 5 void get_prime(){//歐拉篩 6 memset(isprime,true,sizeof(isprime)); 7 isprime[0]=false,isprime[1]=false; 8 for(int i=2;i<maxn;++i){ 9 if(isprime[i])prime[cnt++]=i; 10 for(intj=0;j<cnt&&prime[j]*i<maxn;++j){ 11 isprime[i*prime[j]]=false; 12 if(i%prime[j]==0)break; 13 } 14 } 15 } 16 int main(){ 17 get_prime(); 18 while(~scanf("%d",&n)){flag=false; 19 for(int i=0;prime[i]<=n/2&&i<cnt;++i)//取n的一半20 if(isprime[n-prime[i]]){printf("%d %d\n",prime[i],n-prime[i]);flag=true;} 21 if(!flag)printf("No\n"); 22 } 23 return 0; 24 }
ACM_哥德巴赫猜想(素數篩)