1
头图

首先得声明一句,本人文学专业出身,数学确实不好,可以说完全零基础,因此这篇博客的代码花了接近一下午的时间(并不是代码有多难,而是自己数学太差,所以得查半天资料研究)

什么是哥德巴赫猜想

(以下内容来自百度百科)

哥德巴赫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"成立,即"任一充分大的偶数都可以表示成二个素数的和,或是一个素数和一个半素数的和"。
图片.png
今日常见的猜想陈述为欧拉的版本,即任一大于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;

瞿小凯
1.3k 声望593 粉丝