测试地址:?
【题目描述】
原题来自: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;
}