1. 程式人生 > >ACM_哥德巴赫猜想(素數篩)

ACM_哥德巴赫猜想(素數篩)

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>
 2
using 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(int
j=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_哥德巴赫猜想(素數篩)