共计 1517 个字符,预计需要花费 4 分钟才能阅读完成。
首先得申明一句,自己文学业余出身,数学的确不好,能够说齐全零根底,因而这篇博客的代码花了靠近一下午的工夫(并不是代码有多难,而是本人数学太差,所以得查半天材料钻研)
什么是哥德巴赫猜想
(以下内容来自百度百科)
哥德巴赫 1742 年在给欧拉的信中提出了以下猜测:任一大于 2 的整数都可写成三个质数之和 [1]。然而哥德巴赫本人无奈证实它,于是就写信求教赫赫有名的大数学家欧拉帮忙证实,然而始终到死,欧拉也无奈证实。[2] 因现今数学界曾经不应用“1 也是素数”这个约定,原初猜测的古代陈说为:任一大于 5 的整数都可写成三个质数之和。(n>5:当 n 为偶数,n=2+(n-2),n- 2 也是偶数,能够合成为两个质数的和;当 n 为奇数,n=3+(n-3),n- 3 也是偶数,能够合成为两个质数的和)欧拉在回信中也提出另一等价版本,即任一大于 2 的偶数都可写成两个质数之和。今日常见的猜测陈说为欧拉的版本。把命题 ” 任一充沛大的偶数都能够示意成为一个素因子个数不超过 a 个的数与另一个素因子不超过 b 个的数之和 ” 记作 ”a+b”。1966 年陈景润证实了 ”1+2″ 成立,即 ” 任一充沛大的偶数都能够示意成二个素数的和,或是一个素数和一个半素数的和 ”。
今日常见的猜测陈说为欧拉的版本,即任一大于 2 的偶数都可写成两个素数之和,亦称为“强哥德巴赫猜想”或“对于偶数的哥德巴赫猜想”。
从对于偶数的哥德巴赫猜想,可推出:任何一个大于 7 的奇数都能被示意成三个奇质数的和。后者称为“弱哥德巴赫猜想”或“对于奇数的哥德巴赫猜想”。若对于偶数的哥德巴赫猜想是对的,则对于奇数的哥德巴赫猜想也会是对的。2013 年 5 月,巴黎低等师范学院研究员哈洛德·贺欧夫各特发表了两篇论文,发表彻底证实了该猜测。
** 说了这么多,咱们总结一句话,那就是:
咱们要在 2000 以内的不小于 4 的正偶数都可能合成为两个素数之和(即验证歌德巴赫猜想对 2000 以内的正偶数成立)**
思路
既然晓得题目要求,咱们接下来就要设计算法了
首先,咱们本人定义一个函数,咱们假如函数名字叫 fun,将素数过滤出来
int fun(int n)
{
int i;
if(n==2)
return 1; /* n 是 2,返回 1 */
if(n%2==0)
return 0; /* n 是偶数,不是素数,返回 0 */
for(i=3; i<=sqrt(n); i+=2)
if(n%i==0)
return 0; /* n 是奇数,不是素数,返回 0 */
return 1; /* n 是除 2 以外的素数返回 1 */
}
有了素数的判断,接下来,咱们就能够设计主函数了。
因为是用户输出,所以为了避免“淘气的用户乱输出”导致报错,所以咱们思考下空值的状况,以及非偶数的状况,另外,通过退出 ok 来管制输入。
残缺代码如下;
#include<math.h>
#include<stdio.h>
int fun(int n)
{
int i;
if(n==2)
return 1; /* n 是 2,返回 1 */
if(n%2==0)
return 0; /* n 是偶数,不是素数,返回 0 */
for(i=3; i<=sqrt(n); i+=2)
if(n%i==0)
return 0; /* n 是奇数,不是素数,返回 0 */
return 1; /* n 是除 2 以外的素数返回 1 */
}
int main()
{
int n, i, ok;
while(scanf("%d",&n)!=EOF)
{
ok=0; /* 进入循环前先置标记位 */
for(i=2; i<=n/2; i++)
{if( fun(i) )
if(fun(n-i) )
{printf("%d %d\n", i, n-i); /* i 和 n - i 都是素数,则打印 */
ok=1;
}
if(i!=2)
i++;
if(ok)
break; /* 已打印出所须要的输入后果,跳出循环 */
}
}
return 0;