用计算机程序求n,计算机编程 算法 求n!.doc

计算机编程 算法 求n!.doc

算法:求n!

任务

通过对“n!”(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”之间输入以下的程序代码。

Dim S As Single, n As Integer, I As Integer

n = Text1.Text

S = 1

For I = 1 To n

S = S * I

Next

Label1.Caption = S

第一行,定义了两个整数类型的数值变量n,I。还定义了一个单精度浮点类型的变量S。

第二行,将text1文本框中的数据转换为整型数值并赋值给整型变量n.。

第三行,将一个初始值1赋值给代表阶乘结果的变量S,因为在累乘算法中如果初始值是0的话,那么累乘的结果永远是0,这就没有任何累乘的意义了。

第四行,将1赋值给代表每次累乘值的变量I,因为阶乘是从1开始累乘的,所以累乘变量的初值应该是1。

第五行,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)保存工程。

开始

输入正整数n

S=1

I=1

S=S*I

I=I+1

Yes

I<=N?

No

输出S

结束

活动建议

n!有一个特殊情况,就是0!=1,你能将这个算法的流程图补充完整吗?

活动建议

想一想:为什么n!的那个特例不能用这个程序来实现?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值