android的几个小技巧
最近小鸟我没找到什么好看的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判断以及函数的调用;主要是循环与判断如何搭配好,在这就是要注意循环结束的标志,而且要选好判断点!
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。