哥德巴赫猜想C语言

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第19章哥德巴赫猜想问题描述问题分析及实现开发过程常见问题及解决第19章哥德巴赫猜想问题描述问题分析及实现开发过程常见问题及解决第19章哥德巴赫猜想问题描述问题分析及实现开发过程常见问题及解决第19章哥德巴赫猜想问题描述问题分析及实现开发过程常见问题及解决哥德巴赫猜想从哥德巴赫猜想(GoldBachConjecture)提出这个猜想至今,许多数学家都不断努力想攻克它,但都没有成功。本章将使用C语言从算法问题入手,并一步步实现一个验证“猜想”结论正确性的程序。19.1问题描述哥德巴赫猜想大致可以分为以下两个猜想。⑴二重哥德巴赫猜想:每个不小于6的偶数都可以表示为两个奇素数之和,如下:6=3+3;8=3+5;10=5+5……⑵三重哥德巴赫猜想:每个不小于9的奇数都可以表示为三个奇素数的和,如下:9=3+3+3;11=3+3+5;13=3+5+5在这里,我们以二重哥德巴赫猜想作为研究对象,通过编写C语言程序,来验证“猜想”的正确性。19.2问题分析及实现19.2.1问题分析19.2.2问题实现19.2.3程序运行19.2问题分析及实现拿到一个要求实现的算法问题,首先要看清、想明、把握每一个细节。只有这样,才可以顺利地将算法实现。由问题描述:“每个不小于6的偶数都可以表示为两个奇素数之和”,可知,我们要实现的是判断任何一个大于6的偶数都可以有两个素数相加。以下将仔细地分析问题并实现算法。19.2.1问题分析而我们的将要编写的程序,就是为了验证哥德巴赫猜想中提到的任何一个偶数,对大于6的偶数n可以分解成两个素数的和,这个结论是否正确。所以,程序应该可以输入一个数,判断是否为偶数,将这个偶数分解成一个小素数和大素数。再分别判断小素数与大素数之合是否就等于这个偶数。而且,需要将结果打印输出。19.2.1问题分析我们在编程之前,需要明确两个数学概念:素数和偶数。⑴素数就是质数,指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。换句话说,只有两个正因数(1和数自身)的自然数即为素数。⑵偶数就是能被2整除的自然数,如2、4、6、8……。根据题目,要求是奇素数,即这个素数不可以是2,一定要大于2。我们需要划分以下两个子模块。⑴判断一个数是否为素数。⑵判断并分解大小素数的和是否等于需判断的偶数。19.2.2问题实现1.判断输入的数字是否是素数对于一个任何自然数,如何判断他是素数呢?如果这个自然数n,它存在两个因数,乘积等于n,要么两个因数一个是小于、一个大于,要么两个因数都等于。那么,根据这个思路,代码如下(代码19-1.txt)。nnn19.2.2问题实现01/*测试n是否是素数。如果是,返回1,否则返回0*/02intIsPrimer(unsignedlongn)03{04unsignedlongi;05unsignedlongnqrt;06if(n==2)07return1;08if(n==1||n%2==0)09return0;10/*如果它存在两个因数,乘积等于n,要么两个因数一定一个小于根号n,一个大于根号n要么两个因数都等于根号n*/11nqrt=(unsignedlong)sqrt(n);12for(i=2;i=nqrt;i+=1)13{14if(n%i==0)15return0;16}17return1;18}19.2.2问题实现2.将数偶数分解成两个素数,并判断“猜想”结论是否成立。取一个数i,从最小素数开始到这个偶数的一半大小进行判断,当i为素数同时n-i也是素数时,这时猜想结论成立,否则结论不成立。代码如下(代码19-2.txt)。19.2.2问题实现01intIsRight(unsignedlongn,unsignedlong*tmpNumA,unsignedlong*tmpNumB)02{03unsignedlongi;04unsignedlonghalf;05half=n/2;06for(i=3;i=half;i+=2)07{08if(IsPrimer(i)&&IsPrimer(n-i))09{10*tmpNumA=i;11*tmpNumB=n-i;12return1;13}14}15return0;16}19.2.2问题实现3.要求用户输入,判断,并输出结果。在主程序中,要求用户输入一个大于6的偶数,调用判断函数,判断“猜想”是否成立,成立则输出等式,不成立则输出“猜想”错误。代码如下(代码19-3.txt)。19.2.2问题实现01intmain(void)02{03unsignedlongnumber;/*被验证的数*/04unsignedlonga,b;/*和为number的两个素数*/05do06{07printf(请输入要验证的大于等于6的偶数(输入0则退出):);08scanf(%lu,&number);09if(number=6&&(number%2==0))10{11if(IsRight(number,&a,&b))12{13printf(哥德巴赫猜想对此数是正确的。\n);14printf(%lu=%lu+%lu\n,number,a,b);15}16else17{18printf(%lu,哥德巴赫猜想对此数是错误!,number);19}20}21}while(number!=0);2223return0;24}19.2.3程序运行19.3开发过程常见问题及解决开发过程常见问题及解决办法如下,仅供参考。⑴如果出现“warningC4013:'sqrt'undefined;assumingexternreturningint”的编译警告,通常需要在程序开头添加数学函数头文件“#includemath.h”。⑵此程序的难点之一是如何判断一个数为素数。这点在程序中已经给出一注释,希望读者细细体会。⑶此程序另一难点是分解成素数。其实就是从最小素数开始,将最小素数i作为素数A,将偶数减i作为素数B,在A、B都是素数的情况下,分解成功。

1 / 18
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功