1、常用算法(一),算法是对某个问题求解过程的描述 1. 累加、连乘,1100的5或7的倍数的和 Sum = 0For i = 1 To 100 循环If i Mod 5 = 0 Or i Mod 7 = 0 ThenSum = Sum + iEnd IfNext iPrint Sum,310的乘积 t = 1For i =3 To 10t = t * iNext iPrint t,思考:若把循环体前面置各变量初值的语句放在循环体内,程序运行时会产生什么情况?,1、计算n! Private Sub Form_Click()鼠标单击窗体事件 Dim n%, s% %:整型数据类型 相当于 Dim n
2、 As Integer,定义整数类型变量n,s n = InputBox(“请输入n的值“) n=5 s = 1 For i = 1 To n 循环 当i=1-5时 s = s * i s=1*1*2*3*4*5=120 Next i Print n s /输出 5!=120 End Sub,2、计算1!+2!+3!+.+10! Private Sub Form_Click() Dim s s End Sub,例4.14 求自然对数e的近似值,要求其误差小于0.00001,近似公式为:该例题涉及两个问题:(1)用循环结构求级数和的问题。本例根据某项值的精度来控制循环的结束与否。(2)累加:e=
3、e+t 循环体外对累加和的变量清零 e=0连乘:n=n*i 循环体外对连乘积变量置1 n=1Private Sub Form_Click()Dim i%,n e End Sub,2. 求素数 素数是一个大于2,且不能被1和本身以外的整数整除的整数。 判别某数m是否为素数最简单的方法是: 对于m 从 i=2,3,m-1判别m能否被i整除,只要有一个能整除,m不是素数,否则m是素数。 例4.15 求100以内素数的代码:For m = 2 To 100 For i = 2 To m - 1If (m Mod i) = 0 Then GoTo NotNextM 当运行到goto即会跳转到对应地方Ne
4、xt iPrint m NotNextM:Next m,m是否为素数,求100以内的素数,思考: 此例用Go To语句对非素数不作判断,若不用GoTo语句,如何修改程序?,判断一个数 M是不是素数 Private Sub Form_Click() m = Val(InputBox(“请输入一个数:“) For i = 2 To m - 1If m Mod i = 0 Then Exit For 退出for循环 Next i If i = m - 1 ThenPrint m; “是素数“ Else Print m; “不是素数“ End If End Sub 9 拿2-8每一个数去除 i=3时
5、9 mod 3=0,输出100到300之间的所有素数(每行输出5个) Private Sub Form_Click() t = 0 For m = 100 To 300 m=100For i = 2 To m - 1If m Mod i = 0 Then Exit ForNext iIf i = m - 1 Then Print Tab(t * 8); m;: t = t + 1If t = 5 Then t = 0: PrintNext m End Sub,3.穷举法 “穷举法”也称为“枚举法”或“试凑法”,即将可能出现的各种情况一一测试,判断是否满足条件,一般采用循环来实现。 例4.16
6、百元买百鸡问题。假定小鸡每只5角,公鸡每只2元,母鸡每只3元。现在有100元钱要求买100只鸡,编程列出所有可能的购鸡方案。设母鸡、公鸡、小鸡各为x、y、z只,根据题目要求,列出方程为:x+y+Z=1003x+2y+0.5z=100 三个未知数,两个方程,此题有若干个解。 解决此类问题采用“试凑法”,把每一种情况都考虑到。方法一:最简单三个未知数利用三重循环来实现。方法二:从三个未知数的关系,利用两重循环来实现。,Private Sub Form_Click() Dim x%, y%, z% %、!分别为整型和单精度型数据类型 For x = 0 To 33 母鸡3元一只,最多33只For y
7、 = 0 To 50 step 1公鸡2元一只,最多50只z = 100 - x - yIf x * 3 + y * 2 + 0.5 * z = 100 ThenPrint “母鸡:“; x, “公鸡:“; y, “小鸡:“; zEnd IfNext y 下一个y y=y+1 必须先结束内循环,才开始下一次外循环 Next x 下一个x x=x+1 End Sub,4.递推法“递推法”又称为“迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重复都从旧值的基础上递推出新值,并由新值代替旧值。 例4.17 猴子吃桃子。小猴在某天摘桃若干个,当天吃掉一半多一个;第二天吃了剩下
8、的桃子的一半多一个;以后每天都吃尚存桃子的一半多一个,到第7天要吃时只剩下一个,问小猴共摘下了多少个桃子? 分析:这是一个“递推”问题,先从最后一天推出倒数第二天的桃子,再从倒数第二天的桃子推出倒数第三天的桃子。设第n天的桃子为xn,那么它是前一天的桃子数的xn-1 的一半减1,即xn =( xn-1 +1)2,Private Sub Form_Click() Dim x%, i% x = 1 For i = 7 To 1 Step -1Print “第“; i; “天的桃子数为:“; xx = (x + 1) * 2 Next i End Sub,5.最小、最大值 在若干个数中求最大值,一般
9、先假设一个较小的数为最大值的初值,若无法估计较小的值,则取第一个数为最大值的初值;然后将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值;依次逐一比较。 例 随机产生10个100200之间的数,求最大值。,Private Sub Command1_Click()Max = 100For i = 1 To 10x = Int(Rnd * 101 + 100)Print x;If x Max Then Max = xNext iPrintPrint “最大值=“; Max End Sub,求两个整数的最大公约数、最小公倍数 Private Sub Form_Click() m = Val
10、(InputBox(“请输入第一个数:“) n = Val(InputBox(“请输入第二个数:“) Print “m=“; m, “n=“; n If m 0m = nn = rr = m Mod n Loop Print “最大公约数是:“; n End Sub,常 见 错 误 1. 不循环或死循环的问题主要是循环条件、循环初值、循环终值、循环步长的设置有问题。 2. 循环结构中缺少配对的结束语句For 少 配对的Next 3. 循环嵌套时,内外循环交叉 4. 累加、连乘时,存放累加、连乘结果的变量赋初值问题(1)一重循环在一重循环中,存放累加、连乘结果的变量初值设置应在循环语句前。 (2)多重循环 这要视具体问题分别对待。,