- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法:国际象棋发明者的奖赏
任务
通过对等比级数求和算法的描述以及程序实现的方法介绍,进一步了解循环结构算法的特征,掌握循环语句的使用方法。
相传国际象棋是由印度舍罕王手下的大臣西萨·班·达依尔发明的,舍罕王准备奖赏达依尔,问他想得到什么样的奖赏,大臣说:“陛下,请您在这张棋盘的第一个小格内赏给我一粒麦子,在第二个小格内给两粒,在第三个小格内给四粒,照这样下去,每一小格内都比前一小格内的麦粒数加一倍,直到把每一小格都摆上麦粒为止。并把这样摆满棋盘上六十四格的麦粒赏给您的仆人。”国王认为这位大臣的要求不算多,就爽快地答应了。国王叫人抬来麦子并按这位大臣的要求,在棋盘的小格内摆放麦粒:在第一格内放一粒,第二格内放两粒,第三格内放四粒……第十格内放五百一十二粒,还没摆到第二十格,一袋麦子已经用光了。国王这才发现,即使把全国的麦子都拿来,也兑现不了他对这位大臣的奖赏承诺,这位大臣所要求的麦粒数究竟是多少呢?
一、等比级数求和
这是一个等比级数求和的问题。即:1+2+2^2+2^3+2^4+……+2^63,可以变形为:2^0+2^1+2^2+2^3+2^4+……+2^63,从中可以看出其中的等比级数可以表示为2^(n-1),n从1取值到64。
等比级数求和的算法流程图
开始
开始
输入正整数
输入正整数n
S=0
S=0
I=1
I=1
S=S
S=S+2^(I-1)
I=I+1
I=I+1
YesI=N?
Yes
I=N?
No
No
输出
输出S
结束
结束
流程图中通过一个条件判断,如果条件成立就重复一次已经做过的语句,直至条件不成立。
三、算法的程序实现
为了实现这个算法,则需要编制相应的程序,在程序中除了需要用到赋值语句、输入输出语句、其它计算语句外,还必须用到循环语句。
范例:我使用VB来编写程序实现这个算法。
活动建议学习知识充电站中有关“For/Next”循环语句的内容
活动建议
学习知识充电站中有关“For/Next”循环语句的内容。
而对于这种已知循环次数的算法,使用“For/Next”循环语句来实现则更加简洁。
算法中用到了一条输入语句、一个循环语句、一个输出语句。其中输入语句和输出语句与顺序结构的例题中的语句一致。
(1)建立窗体和输入、输出、命令按钮组件对象。
方法与前二节一样。
(2)编写“Command1”触发的程序代码。
在“Private Sub command1_click()”和“End Sub”之间输入以下的程序代码。
Dim S As Long, n As Integer, I As Integer
n = Text1.Text
S = 0
For I = 1 To n
S = S + 2 ^ (I - 1)
Next
Label1.Caption = S
第一行,定义了三个整数类型的数值变量S,n,I。其中S是Long长整数类型。
第二行,将text1文本框中的数据转换为整型数值并赋值给整型变量n.。
第三行,将初始值0赋值给代表小麦粒数的变量S,这是一个“累加器”的算法,一般来说,“累加器”变量的初值应该为0。
第四行,循环变量的初值应该从1开始,循环n次。
第五行,S = S + 2 ^ (I - 1),表示一个累加算法,它将变量S的原值加上表达式的值,然后将加法运算的结果重新赋值给变量S作为S的新值。
第六行,“NEXT”有两层含义。
首先是进行I=I+1操作,表示一个累加算法,即每进行一次累加的运算,I就在原来的基础上增加1。因为,在这个循环语句中是将I作为判断循环条件依据的,所以,I的值必须在循环体中有所改变,否则就会进入“死循环”。
然后,判断“I=n”是否成立,如I=n成立时继续循环,从第四行“For”的下面一行继续执行。如果I=n不成立,即I比n大时,则不再循环,直接执行下一行即第七行的语句,从而结束循环。
第七行,将表示累加最终值的变量S的值赋值给“Label1”组件对象的“Caption”属性,输出小麦的粒数。
(3)运行程序。
将第一个文本框中的“Text1”删除,重新输入“31”;然后单击“Command1”,就能在原来“Label1”的位置上值“2147483647”。但是,当我们取大于31的数值时,发生程序运行时发生了数值溢出的警告对话框。
(4)修改调试
我们可以修改程序中的变量定义,将S的数值类型从长整型改为单精度浮点型,这样就能以浮点数形式来表示这么一个极大的数了。这个数用整数完整地表示则为“18,446,744,073,709,551,615”,是全世界在两千年内所产的小麦的总和!如果造一个仓库来放这些麦子,仓库高4米,宽10米,那么仓库的长度就等于地球到太阳的距离的两倍。
Dim S As Long, n As Integer, I As Integ
原创力文档


文档评论(0)