算法:求n!
对于“求n!”这个问题,高中学生不是很清楚,所以应该对n!的定义进行一个说明。并理解用计算机来求解n!的一种算法,
一、什么是n!
在函数型计算器上有一个特殊的按钮,就是“n!”,称为“阶乘”,在数学上表示从1一直累乘到n,即n!=1*2*3*……*n,在高中数学的排列组合运算中会大量运用。视窗系统附件中的“计算器”面板上也有阶乘的按钮“n!”。
在这个算法中,首先要得到n的值,然后必须对一些变量进行初始化,一般情况下用于乘法的变量初值必须为1。试想,如果用于乘法的变量初值是0的话,那么根据乘法的一个规则,“任何数乘以0,则相乘的结果仍然是0”,因此,这个累乘的算法就没有意义了。因此,在计算时,必须从1开始每次乘上一个递增的自然数,直到n为止。其中每次乘上一个自然数的过程就是一个重复的过程,所以我们可以使用循环结构来实现。
二、n!的算法流程图
下面的流程图就给出了用计算机程序实现阶乘的一种思路。
流程图中通过一个条件判断,如果条件成立就重复一次已经做过的语句,直至条件不成立。
实现上面流程图算法的循环语句可以用“Do....Loop While ”语句,也可以使用“For/Next ”循环语句,由于n 是确定的,即循环次数是已知的,所以用“for/Next ”较为方便。
对n!来说,计数变量的初值应该是1,终值必须为n ,由于n!中循环变量值每次增加1,所以步长值为1,而当步长值为1时,则步长这部分可以省略。
三、算法的程序实现
为了实现这个算法,则需要用计算机程序设计语言来编制相应的程序,在程序中除了需要用到赋值语句、输入输出语句、其它计算语句外,还必须用到循环语句。
范例:我使用VB 来编写程序实现这个算法。
算法中用到了一条输入语句、一个循环语句、一个输出语句。其中输入语句和输出语句与顺序结构的例题中的语句一致。
(1)建立窗体和输入、输出、命令按钮组件对象。
方法与前二节一样,注意将lable 组件对象的宽度设置得大些,
以便能完整地显示阶乘的结果。
(2)编写“Command1”触发的程序代码。
在“Private Sub command1_click()”和“End Sub”之间输入以下
的程序代码。
第一行,定义了两个整数类型的数值变量n,I。还定义了一个单精度浮点类型的变量S。
第二行,将text1文本框中的数据转换为整型数值并赋值给整型变量n.。
第三行,将一个初始值1赋值给代表阶乘结果的变量S,因为在累乘算法中如果初始值是0的话,那么累乘的结果永远是0,这就没有任何累
乘的意义了。
第四行,将1赋值给代表每次累乘值的变量I,因为阶乘是从1开始累乘的,所以累乘变量的初值应该是1。
while循环语句的程序流程图
第五行,S=S*I,表示一个累乘算法,它将变量S的原值乘以变量I 的值,然后将乘法运算的结果重新赋值给变量S作为S的新值。这里的“=”不是相等的意思,而是“赋值”的意思,即将“=”号右侧的算式进行计算后,把计算的结果赋值给“=”号左侧的变量。
第六行,“NEXT”有两层含义。
首先是进行I=I+1操作,表示一个累加算法,即每进行一次累加的运算,I就在原来的基础上增加1。
然后,判断“I<=n”是否成立,如I<=n成立时继续循环,从第四行“For”的下面一行继续执行。如果I<=n不成立,即I比n大时,则不再循环,直接执行下一行即第七行的语句,从而结束循环。
第七行,则表示阶乘最终值的变量S的值赋值给“Label1”组件对象的“Caption”属性,输出n!的结果。
(3)运行程序。
将第一个文本框中的“Text1”删除,重新输入“
5”;然后单击“Command1”,就能在原来“Label1”的位置上输出5!的值“120”。
请用计算机来验证一下,看看5!是否等于120?
尝试用其它的正整数来测试该程序,发现当n取到比较大时,如大于
35时,VB会发出数值溢出的警告。这说明,n!的值是很大的,我们这个程序只能对比较小的值进行阶乘运算。事实上,一般的计算器都能运算到69!而不溢出。
(4)保存工程。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。