任务描述
在 1742 年,Christian Goldbach,一个德国的业余数学家,给 Leonhard Euler 写信,在信中提出如下猜想(哥德巴赫猜想): 每个大于 4
的偶数可以写成两个奇素数的和。例如:8=3+5
,3
和 5
都是奇素数;而 20=3+17=7+13
;42=5+37=11+31=13+29=19+23
。 现在哥德巴赫猜想仍然没有被证明是否正确。现在请您证明对所有小于一百万的偶数,哥德巴赫猜想成立。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
输入说明: 输入包含一个或多个测试用例。每个测试用例给出一个偶整数 n
,6≤n<1000000
。输入以 0 结束。
输出说明: 对每个测试用例,输出形式为 n = a + b
的一行,其中 a
和 b
是奇素数,数字和操作符要用一个空格分开,如样例输出所示。如果有多于一对的奇素数的和加起来为 n
,就选择 b – a
最大的一对。如果没有这样的对,输出"Goldbach's conjecture is wrong.
"。
平台会对你编写的代码进行测试:
测试输入: 8
20
42
0
预期输出: 8 = 3 + 5
20 = 3 + 17
42 = 5 + 37
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 1000010
int p[N];
void IsPrime()
{
memset(p,0,sizeof(p));//假设所有数都为素数
for(int i = 2; i<N; i++)
{
if(!p[i])//如果i 是素数,则i 的倍数都为非素数
for(int j = i+i; j<=N; j+=i)
{
p[j] = 1;//非素数
}
}
/*测试
for(int i = 1; i<N; i++)
if(!p[i])
printf("%d\t",i);
*/
}
int main()
{
IsPrime();//提前打表
int n,a,b;
while(~scanf("%d",&n) && n)
{
a = 0;
b = 0;
for(int i = 2; i<n; i++)
{
if(!p[i] && !p[n-i])
{
a = i;
b = n-i;
break;
}
}
if(!a && !b)
printf("Goldbach's conjecture is wrong.\n");
else
printf("%d = %d + %d\n",n,a,b);
}
return 0;
}