描述
哥德巴赫猜想(Goldbach's conjecture)是数论中存在最久的未解问题之一。这个猜想最 早出现在1742年普鲁士人克里斯蒂安•哥德巴赫与瑞士数学家莱昂哈德•欧拉的通信中。
用现代的数学语言,哥德巴赫猜想可以陈述为:任一大于2的偶数,都可表示成两个素数之和。
现在请验证“哥德巴赫猜想”。输入一个正整数a然后输出这个数所有形如a = b + c的形式。而其中b<=c且b和c均是素数,如果存在多种可能,请按b的升序输出所有的分解
输入
234
输出
234 = 5 + 229
234 = 7 + 227
234 = 11 + 223
234 = 23 + 211
234 = 37 + 197
234 = 41 + 193
234 = 43 + 191
234 = 53 + 181
234 = 61 + 173
234 = 67 + 167
234 = 71 + 163
234 = 83 + 151
234 = 97 + 137
234 = 103 + 131
234 = 107 + 127
分析
根据哥德巴赫猜想,我们可以得出如下信息:
哥德巴赫数字是一个大于2的偶数。
哥德巴赫数字等于两个素数相加。
思考:一个数a要分解成形如a=b+c的形式(a,b,c都是正整数)。那必然是
a=1+a-1
a=2+a-2
a=3+a-3
......
a=a/2+a/2
......
a=a-3+3
a=a-2+2
a=a-1+1
因为b<=c并且且b是升序排列,而a是大于2的偶数,显然1不是素数,那么b只需要从2排到a/2就行了。
a=2+a-2
a=3+a-3
......
a=a/2+a/2
接着b和c是两个素数。那么只要筛选出b和c同时为素数的式子就行了。
#include<stdio.h>
#include<math.h>
//判断一个数是否是素数
int is_prime(int num)
{
int i = 0;
for (i = 2; i <= sqrt(num); i++)
{
if (num % i == 0)
return 0;//不是素数则返回0
}
return 1;//是素数则返回1
}
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
for (b = 2; b <= a / 2; b++)
{
if (is_prime(b) == 1 && is_prime(a - b) == 1)
printf("%d = %d + %d\n", a, b, a - b);
}
return 0;
}