测试地址:☞
【题目描述】
原题来自:Ulm Local,题面详见:POJ 2262
哥德巴赫猜想:任何大于 4 的偶数都可以拆成两个奇素数之和。 比如:
8=3+5
20=3+17=7+13
42=5+37=11+31=13+29=19+23
你的任务是:验证小于 10^6 的数满足哥德巴赫猜想。
【输入】
多组数据,每组数据一个 n。
读入以 0 结束。
【输出】
对于每组数据,输出形如 n=a+b,其中 a,b 是奇素数。若有多组满足条件的 a,b,输出 b−a 最大的一组。
若无解,输出 "Goldbach’s conjecture is wrong."
。
【输入样例】
8
20
42
0
【输出样例】
8 = 3 + 5
20 = 3 + 17
42 = 5 + 37
【提示】
数据范围与提示:
对于全部数据,6≤n≤10^6 。
【AC代码】
#include<cstdio>
#include<cstring>
const int maxn = 1e6+5;
bool u[maxn];
int su[maxn];
int t;
//欧拉筛模板
void prime(){
memset(u, true, sizeof(u));
t = 1;
for(int i = 2; i <= maxn; i++){
if(u[i]) su[t++] = i;
for(int j = 1; j < t; j++){
if(i*su[j] > maxn) break;
u[i*su[j]] = false;
if(i%su[j] == 0) break;
}
}
return ;
}
int main(){
prime();
while(true){
int n, flag;
scanf("%d", &n);
flag = 0;
if(n == 0) break;
for(int i = 1; i<=t && su[i]<n; i++){
if(u[n-su[i]]){
printf("%d = %d + %d\n", n, su[i], n-su[i]);
flag = 1;
break;
}
}
if(!flag)
printf("Goldbach's conjecture is wrong.\n");
}
return 0;
}