哥德巴赫猜想――(C语言)之妙趣横生的算法


wKiom1MoJ63TK9SVAABJjjMD_Ao936.jpg 最近小鸟我没找到什么好看的Linux书籍,无聊时就向老师借了本《零基础学算法》这本书,顿时找到了感觉,呵呵!在这就给大家分享个算法吧! w_0039.gif

       

   

       “1742年,哥德巴赫在教学中发现,每个不小于六的偶数都是两个素数之和。例如:

6=3+3

12=5+7

大数学家欧拉相信这个猜想是正确的,但他不能证明。叙述如此简单的问题,连欧拉这样首屈一指的数学家都不能证明,这个猜想便引起了许多数学家的注意。从哥德巴赫提出的这个猜想至今,许多数学家都不断努力向攻克它,但都没有成功。”

   当然曾今有人做了些具体的验证,例如:

首先验证:6=3+3;

接着验证:8=3+5;

接着检验:10=5+5;

......

     对于隔得巴赫猜想的验证,小鸟的基本思路是:设n为大于等于6的一个偶数,可将其分解为n1和n2两个数,分别检验n1和n2是否为素数,若都是,则该数得到验证。若n1不是素数,就不必再检查n2是否为素数。先从n1=2开始,检验n1和n2(=n-n1)是否为素数。然后使n1+2再检验n1,n2是否为素数......,直到n1=n/2为止。

       根基上面的思路,小鸟用C(目前小鸟只会C,别笑哦!j_0057.gif)写出了如下的算法:

    
#include<stdio.h>
#include<stdlib.h>
int CreatPrime(int n,int prime[])                                  //用筛选法得到素数数组
{
    int i,j;
    for(i=2;i<=n;i++)                                       //初始化数组
        prime[i]=1;                                    //标识为1表示对应的数为质素
    for(i=2;i*i<=n;i++)                                   //循环处理前i个
    {
        if(prime[i]==1)                              //若为素数
        {
            for(j=2*i;j<=n;j++)                 //筛去合数
            {
                if(j%i==0)                 //能被整除
                    prime[j]=0;       //不是素数
                        }
                    }
                }
            }
int main()
{
    int n,i,j,flag;
    int *prime;                                 //定义保存素数的数组
    printf("输入一个最大范围n(n>=6):");
scanf("%d",&n);
if(n<6)                                                 //判断输入数据是否合法
{
    printf("数据输入错误!\n");
    return 0;
}
if(!(prime=(int *)malloc(sizeof(int)*n)))                         //分配内存保存素数
{
    printf("分配内存失败!\n");
    getch();
    return 0;
}
Createprime(n,prime);                                                     //生成素数数组
for(i=6;i<=n;i++)                                                        //从6开始,循环验证各偶数
{
    flag=1;
    for(j=2;j<=i/2;j++)                                               //判断组成每个数的两个加数                                            
    {
        if(j%2==0 ||((i-j)%2==0))                                     //若一个加数为偶数,则不进行素数判断
            continue;
        if(prime[j]==1 && prime[i-j]==1)                                 //若两个加数都是素数
        {
            printf("%d=%d+%d\n",i,j,i-j);                             //输出素数
            flag=0;                             //清除标志
            break;
            }
        }
        if(1==flag)                                                                //若某个偶数不是由两个奇数组成
            printf("找到一个不符合要求的偶数:%d\n",i);
}
    getch();
    return 0;
}


好了,让我们一起来总结一下这个算法吧:    wKioL1MoO7SDpROWAABlGNZDxuo022.jpg

  这个程序主其实主要用到了 for循环和if判断以及函数的调用;主要是循环与判断如何搭配好,在这就是要注意循环结束的标志,而且要选好判断点

你可能感兴趣的:(哥德巴赫猜想-算法)