您的位置:首页 > 编程语言 > Go语言

poj2262 Goldbach's Conjecture 素数的欧拉筛法

2014-07-16 21:32 411 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: