题目:
1742年,哥德巴赫提出一个猜想:任何大于4的偶数都可以表示为两个奇素数之和。例如:8=3+5,其中3和5都是奇素数, 20=3+17=7+13。42=5+37=11+31=13+29=19+23.
现在的任务是在1,000,000以内验证哥德巴赫猜想。
输入:
输入包含一个或多个数字n,n均为偶数且6<=n<1000000。输入以0结束。
输出:
对于每个数字,打印出一行n = a + b,其中a和b都是奇素数,数字和操作符之间恰好隔一个空格。如果a和b有多对,则输出b-a最大的那对。如果找不到这样的a、b对,则输出 "Goldbach's conjecture is wrong."
样例输入:
8
20
42
0
样例输出:
8 = 3 + 5
20 = 3 + 17
42 = 5 + 37
解题思路:
最小的奇素数是3,令a=3,求出b=n-a,
如果b也为奇素数,则猜想成立,输出结果
如果b不为奇素数,则令a为紧跟着a的下一个奇素数,重复计算b=n-a,直到b为奇素数或者a已经大于n的一半为止。(当a大于n的一半时,说明n不能表示为两个奇素数之和,猜想不成立)
代码:
#include<stdio.h>
//判断一个数是否是奇素数
int isOddPrime(int num)
{
int i;
if(num%2==0) return 0;
for(i=2; i*i<=num; i++)
if(num%i==0) return 0;
return 1;
}
//获得指定奇素数的下一个奇素数
int getNextOddPrime(int num)
{
num++;
while(!isOddPrime(num)) num++;
return num;
}
int main()
{
int n,a,b;
scanf("%d", &n);
while(n != 0)
{
a=3;
b=n-a;
while(!isOddPrime(b))
{
a = getNextOddPrime(a);
b=n-a;
if(a > n/2) break;
}
if(a > n/2) printf("Goldbach's conjecture is wrong.\n");
else printf("%d = %d + %d\n", n, a, b);
scanf("%d", &n);
}
return 0;
}