哥德巴赫猜想——(C语言)之妙趣横生的算法
2014-03-18 20:28
323 查看
最近小鸟我没找到什么好看的Linux书籍,无聊时就向老师借了本《零基础学算法》这本书,顿时找到了感觉,呵呵!在这就给大家分享个算法吧!
“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,别笑哦!
)写出了如下的算法:
#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; }
好了,让我们一起来总结一下这个算法吧:
这个程序主其实主要用到了 for循环和if判断以及函数的调用;主要是循环与判断如何搭配好,在这就是要注意循环结束的标志,而且要选好判断点!
相关文章推荐
- 哥德巴赫猜想——(C语言)之妙趣横生的算法
- 妙趣横生的算法 C语言实现 pdf电子书
- 妙趣横生的算法(C语言实现 第2版)pdf
- 妙趣横生的算法(C语言实现)
- 10个经典的C语言面试基础算法及代码
- CRC算法原理及C语言实现 可算找到了!
- c语言中有关排序的算法
- C语言小算法_1_数值转换
- 详解散列表算法与其相关的C语言实现
- [算法]数据结构算法背包问题解法之递归解法,C语言实现
- C语言实现FFT算法 - 开发手记
- 线性方程组算法(C语言)
- C语言100个算法经典例题(五)
- 10个重要的算法C语言实现源代码
- 自守数算法----C语言实现
- CRC算法原理及C语言实现(介绍了3种方法)
- 夕拾算法初级篇:8) C语言-数字交换
- CRC_8 算法实现 C语言
- 蓝桥杯 - 算法训练 蜜蜂飞舞 C语言实现
- 【C语言】朴素字符串匹配算法及其实现