九位数以内的哥德巴赫猜想验证

目标:需要用程序验证9位数内哥德巴赫猜想,且程序应该尽可能的省时

哥德巴赫猜想:任意一个大于4的偶数可以分解成两个质数之和,即,需要验证从6开始到999999998之内的所有偶数,每一个都可以被分解成两个质数之和的形式,对于某一个数,只需要发现一对符合要求的数,则该数字符合猜想,如果发现了一个范围内偶数,不可以分解成两个质数和的形式,才能证明该猜想错误

基于上述考虑,需要一个返回值为boolean类型的函数,对其传递一个偶数,该函数试图将其拆分成两个质数之和,拆分成功,返回true,否则返回false并停止

首先,先完成判断质数和验证某数是否符合哥德巴赫猜想的基本程序
在这里插入图片描述
1:GoldBach1:完成对质数的判断并打印验证
在这里插入图片描述
在这里插入图片描述
现在来完成最简单的九位数内哥德巴赫猜想证明
思路:给一个maxNum,创建一个函数从6开始,步长为2,循环到maxNum,每次对这个偶数进行尽可能的多次拆分,将其拆分成两个奇数,并判断这两个数是否为质数,实现的过程参考GoldBach1,
为了比较程序的优劣,需要进行时间的比较,在<time.h>中有计算时间的函数,clock();将程序写在两个ciock()中间,最后相减,就是这段程序执行所需要的时间

2:GoldBach2:最基本的猜想判断,对每个数依次检测
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上面的程序进行100000以内的验证就用了5.28秒,效率过于低下,接下来进行优化
观察上面的程序,对于isPrime()这个函数可以进一步优化,同时,质数的判断也是此问题耗时最多的函数
如果num是一个很大的质数,比如 197.按照从6开始,每个奇数验证能否整除197,需要验证97次左右,然而没有必要从3验证到195,只要验证到 197的平方根即可
120能被2整除,且结果为60,那么从61-119就没有数字能把120整除
120能被4整除,且结果为30,那么从31-119就不需要验证
对于121来说,当验证完11能把121整除后,从12到120就没必要验证了,121就不是一个质数

事实上,只要从2开始,验证到n的算术平方根(取整) + 1就可以得到是否为质数

接下来只对isPrime()进行修改,定义range为算数平方根,使用时需要头文件<math.h>
对某个数,判断是不是质数,此时只需要判断从3开始到它的算数平方根有无数能否被它整除,如果没有,那它就是一个质数

3:GoldBach3:只进行maxNum的算数平方根次的判段
在这里插入图片描述

在这里插入图片描述
这时,进行100000以内的证明时间缩短了211倍
通过对isPrime()的优化,效率高了约200倍,接下来还可以继续提升
如果,对于isPrime()中从推导是否为质数改为该数是否为质数,那么可以节约更多时间吗?
创建一个数组,数组元素的值为0或1,其中,元素值为0代表该元素为质数,为1是非质数
关键问题:一个数组元素和哪个数值相对应?
解决方式:一个数组元素所表示的数值就是这个元素的下标

数组下标:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
该元素值:0 0 0 0 1 0 1 0 1 1 1 0 1 0 1 1 1 0 1 0 1 1
上述数组有22个元素,把下标当数值,把元素的值当作判断质数的标准
实现的步骤:1,先 确认 哪些为质数 2,判断一个数是否为质数

考虑到要进行9位数内的验证,需要的数组很大,要消耗大量内存,用空间换时间,加快速度
由于内存有限,所以申请的数组应该尽可能小,即,不要用int,考虑用char作为数组元素类型
现在编写一个程序来创建一个质数表并打印maxNum内的质数
在这里插入图片描述

在这里插入图片描述
这样再次优化中,可以把原先一个个数字挨个判断是否为质数的isPrime()改为从质数表中查询,这个数值所对应的下标是否为0,如果是则为质数

4:GoldBach4:加入质数表,直接判断这个数是否位质数,而不是一一检测
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
现在相比上一个版本,此时对100000运算速度提高了8.3倍
但是上个版本的程序,浪费且占用了太多内存,它用 unsigned char的来表示1和0以区分质数和非质数,这样unsigned char只使用了一位,使用率为1/8,能否只用一个位来表示?

在这里插入图片描述
在这里插入图片描述
5:GoldBach5部分代码:对GoldBach4中的判断质数采用位运算
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

GoldBach5对9位数判断虽然不如GoldBach4快,但是通过位运算极大的减少了内存的占用和浪费
GoldBach5和GoldBach4对9位数所需时间缩短在50s左右 比第一个版本进步了200多倍
这个过程体现了算法的重要性,只需要更改不多的代码,就能提高程序百倍的效率

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值