poj2262 Goldbach's Conjecture 素數的歐拉篩法

題目鏈接: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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章