有图小站

关注电脑网络,记录健康生活。有图小站,价值分享。

当前位置: 首页 > 程序设计 > 接近圆周率的除法

接近圆周率的除法

前面我们把if分支语句select分支语句while循环语句for next循环语句都介绍过了,今天开始我们做几道有趣的题,我相信你一定会印象深刻。

例、圆周率大约在3.1415926—3.1415927之间,我国古代数学家祖冲之计算出了一个整数除法 355/113 非常接近圆周率的值,试编写程序,调整精度,使这两个整数相除最接近圆周率的值。在50以内寻找这样的两个数;寻找500以内这样的两个数。

思路:设定两个数,分别表示除法中的除数和被除数,当两个数的商和圆周率的值差的越小则越接近圆周率。但是我们又不知道圆周率的精确值,所以我们就以两个除数之商作为圆周率,看它和3、3.1、3.14、3.141、3.1415……等不断精确的数之差作为判断的依据。我们不妨先按照思路写一个粗略的程序框架。

cls
for i=1 to 50
for j=1 to 50
if i/j-3>0 and i/j-3<0.5 then print i;"/";j;"=";i/j
next
next
end

上面的例子是以减3这个粗略的结果作为参考来测试的,结果我们发现,有很多的数据都符合。

所以我们下面要做的就是要将精度调的高一级,将接近数据设定为3.1,这个时候 3.1415926-3.1=0.0415926 我们可以设定幅度 0.1 所以我们将浮动的值设定为0.1,那么程序需要修改成:

cls
for i=1 to 50
for j=1 to 50
if i/j-3.1>0 and i/j-3.1<0.1 then print i;"/";j;"=";i/j
next
next
end

运行的结果如下图:

圆周率

再次调整精度为3.14,偏差调整为0.01,为什么呢?因为3.1415926-3.14=0.0015926 所以我们可以设定幅度为0.01 :

cls
for i=1 to 50
for j=1 to 50
if i/j-3.14>0 and i/j-3.14<0.01 then print i;"/";j;"=";i/j
next
next
end

通过这一次调整,我们可以看到如下图结果,

圆周率

由于44/14存在公约数,精简之后仍然是22/7,所以22/7 是50以内最接近圆周率的整数除法。

 但是事情还没有完,我们看看我们的程序,会发现是那么奢侈,我们要改进我们的程序体,使之运算的步骤更少,去掉那些无用的工作。

我们看上面的程序体,由于 i 是作为除法上面的数,那么它至少要大于3.14,所以应该从4开始,那么除法下面的数字 j 呢,其实 j 的取值更应该去头去尾,对于 i 的取值较小的时候也许感觉不到浪费,那么 i 取值较大,如为20的时候,j 从1开始到5都是无效的,因为当j取1到5的时候,所得的商远大于我们的目标数字3.X,另外,对于j取7到20之间的数字时,得到的商远小于3,所以,我们决定以所得除数接近3-4之间的数字最为目标,所以j的取值应该在 i/4  到 i/3 之间,但是j又必须取整数,所以我们使用int函数将 i/4 和 i/3 取整数。所以我们的程序可以修改为:

cls
for i=4 to 50
for j=int(i/4) to int(i/3)
if i/j-3.14>0 and i/j-3.14<0.01 then print i;"/";j;"=";i/j
next
next
end

大家可以分析一下,修改之后的程序比开始的程序少算了多少次。

依此,我们可以轻松写出500以内数字的求法了,逐步修改精度,缩小数字的范围,我们在3.1415这个精度上,可以看到两组数字。

cls
for i=4 to 500
for j=int(i/4) to int(i/3)
if i/j-3.1415>0 and i/j-3.1415<0.0001 then print i;"/";j;"=";i/j
next
next
end

圆周率

同时我们会发现355/113的结果3.141593非常接近我们的理想值 3.1415926

今天给大家写这些主要有两个目的:

1、程序需要不断的调试,测试方能成功;
2、要有优化程序算法的想法,使之尽可能的运算次数少一些,给我们以后编写大程序奠定要的基础和习惯。

在本例中,我们专门提到,不断的调整精度,就是不断的测试和修改的例子,而最后对循环变量的条件的调整是为了大大缩小我们的程序执行效率。本例中的算法还有优化之处,就目前状况来说我们暂时到此阶段,以后专门会讲程序体中那些地方要精简和优化。

今天的例子到此结束,有什么建议可以留言,更多的内容参考有图编写的qbasic教程

本文是 有图小站 原创,原地址 http://www.utosee.com/post/473.html 转载请保留。





上一篇:for next循环语句的使用方法
下一篇:黄金分割点的计算




版权所有 有图小站 关注 电脑 网络 软件 健康 豫ICP备12023314号