当前位置: 代码迷 >> 综合 >> Goldbach’s Conjecture
  详细解决方案

Goldbach’s Conjecture

热度:58   发布时间:2024-02-28 13:44:14.0

测试地址:?

【题目描述】

原题来自: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;
}