題目鏈接:http://poj.org/problem?id=2262
思路:題意很簡單。主要是用一般的素數判定方法速度很慢,據說會有TLE的風險。所以我先用歐拉篩法對 [ 2 , 1000000 ] 以內的素數進行打表。然後從2開始枚舉每個素數a,直接通過打表得到的isPrime[ ]數組判斷 n - a 是不是素數。
前幾次用G++提交都是313MS,用C++提交了一次果斷就141MS了 ^o^
///2014.7.16
///poj2262
//Accepted 1968K 313MS G++ 1415B 2014-07-16 21:19:52
//Accepted 1444K 141MS C++ 1478B 2014-07-16 21:23:23
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
/*===================================================*\
素數打表,該函數執行後
prim[]數組中存入[2,N]區間內的所有素數(從prim[0]開始存入)
isPrime[i] 表示整數 i 是否爲素數
函數返回[2,N]之間的素數的個數
\*===================================================*/
const int N = 1000000;
bool isPrime[N+10];
int prim[80000]; //要注意保證pirm[]數組足夠存儲[2,N]之間的素數
int prime(){
int num = 0;
memset(isPrime,true,sizeof(isPrime));
isPrime[0] = isPrime[1] = false;
for(int i=2 ; i<=N ; i++){
if( isPrime[i] ) prim[num++] = i;
for(int j=0 ; j<num ; j++){
if( i*prim[j]>N ) break;
isPrime[ i*prim[j] ] = false;
if( i%prim[j] == 0 ) break;
}
}
return num;
}
int n;
int main(){
// freopen("in","r",stdin);
// freopen("out","w",stdout);
int a,b;
int numOfPrime = prime();
while( scanf("%d",&n) && n ){
bool findit = false;
for(int i=0 ; i<numOfPrime && prim[i]<n ; i++){
a = prim[i];
b = n-a;
if( isPrime[b] ){
findit = true;
break;
}
}
if( findit )
printf("%d = %d + %d\n",n,a,b );
else
printf("Goldbach's conjecture is wrong.\n");
}
return 0;
}