• 沒有找到結果。

4.4.1 穷举法

穷举就是对所有可能的值进行逐一判断,找出其中符合条件要求的解。

【例 4.24】编写程序,计算我国古代数学家提出的“百钱百鸡问题”:“鸡翁一,值钱 五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏几何?”

分析:这个问题的意思是:一只公鸡值 5 个钱;一只母鸡值 3 个钱;3 只小鸡值 1 个钱。

用 100 个钱买 100 只鸡,公鸡、母鸡、小鸡各有多少只?

我们分别用 X,Y,Z 表示公鸡、母鸡、小鸡的个数 则有:

X + Y + Z =100 ① 5X+3Y+Z/3=100 ②

由方程②可知:X 的取值范围为[0,20]中的整数。

Y 的取值范围为[0,33]中的整数。

因此我们可以用二重循环来解决这个问题。

外循环用 X 控制:0~20;内循环用 Y 控制:0~33;内循环体中根据方程①先求得 Z,

然后再根据方程②判定 X,Y,Z 是不是该问题的解。

控件的属性和作用如表 4-22 所示。

表 4-22 例 4.24 的属性设置

对象 属性 属性值 功能

Form1 Caption 例 4.24 百钱百鸡问题 显示程序的名称

(名称) lblX Label

Caption 公鸡: 显示计算出的公鸡数量

(名称) lblY Label

Caption 母鸡: 显示计算出的母鸡数量

(名称) lblZ Label

Caption 小鸡: 显示计算出的小鸡数量

(名称) cmdStart CommandButton

Caption 计算 开始计算

(名称) cmdClose CommandButton

Caption 关闭 关闭窗口

“计算”命令按钮(cmdStart)的程序源代码如下:

Private Sub cmdStart_Click() Dim X%, Y%, Z%

For X = 0 To 20 For Y = 0 To 33 Z = 100 - X - Y

If 5 * X + 3 * Y + Z / 3 = 100 Then lblX.Caption = lblX.Caption & " " & X lblY.Caption = lblY.Caption & " " & Y lblZ.Caption = lblZ.Caption & " " & Z End If

Next Y Next X End Sub

程序运行结果如图 4-32 所示。

图 4-32 例 4.24 的程序运行界面

请读者考虑:如果程序中的 3 个改变标签控件标题属性的语句变为:

lblX.Caption = X lblY.Caption = Y lblZ.Caption = Z 程序运行会如何变化?

【例 4.25】一个长长的阶梯,如果一次上两阶,最后剩一阶;如果一次上三阶,最后剩 两阶;如果一次上五阶,最后剩四阶;如果一次上六阶,最后剩五阶;如果一次上七阶,刚好 上完。编写程序,计算这个阶梯至少有多少阶?

解法 1

分析:假设阶梯有 X 阶,则:

X Mod 2 = 1 ① X Mod 3 = 2 ② X Mod 5 = 4 ③ X Mod 6 = 5 ④ X Mod 7 = 0 ⑤ 由①知 X 为奇数;

由⑤知 X 为 7 的倍数;

因此,我们设定循环由 7 开始,每次增加 14(如果增加的值为 7,那么初值 7 是奇数,

增加的值是 7 也是奇数,而“奇数+奇数=偶数”。由条件①可知,偶数肯定不是该问题的解,

所以增加的值应至少为 14),循环体中比较 X 是否满足条件②、③、④,如果满足,则找到了 满足条件的 X。

控件的属性和作用如表 4-23 所示,程序运行结果如图 4-33 所示。

表 4-23 例 4.25 的属性设置

对象 属性 属性值 功能

Form1 Caption 例 4.25 计算阶梯数 显示程序的名称

(名称) lblResult Label

Caption 最少阶梯数为: 显示计算结果

(名称) cmdStart CommandButton

Caption 计算 开始计算

CommandButton (名称) cmdClose 关闭窗口

图 4-33 例 4.25 的程序运行界面

“计算”命令按钮(cmdStart)的程序源代码如下:

Private Sub cmdStart_Click() Dim X%

X = 7 Do

If X Mod 3 = 2 And X Mod 5 = 4 And X Mod 6 = 5 Then lblResult.Caption = lblResult.Caption & X

Exit Do Else

X = X + 14 End If

Loop End Sub 解法 2

分析:假设阶梯有 X 阶,则:

X Mod 2 = 1 ① X Mod 3 = 2 ② X Mod 5 = 4 ③ X Mod 6 = 5 ④ X Mod 7 = 0 ⑤ 由①、②、③、④知 X+1 是 2、3、5、6 的倍数,

也就是 X+1 能同时整除 2、3、5、6,换句话说就是(X+1)可整除 2、3、5、6 的最小公 倍数 30,可用表达式表示为:

(X+1) Mod 30 = 0 ⑥

现在条件减少到⑤和⑥两个,由条件⑥控制循环:X 由 29 开始,每次增加 30,循环 体中比较 X 是否满足条件⑤,如果满足,则找到了满足条件的 X。

假设程序中我们仍然用 intLadder 表示阶梯数,程序代码可以修改为:

Private Sub cmdStart_Click() Dim X%

X = 29 Do

If X Mod 7 = 0 Then

lblResult.Caption = lblResult.Caption & X Exit Do

Else

X = X + 30 End If Loop

End Sub 4.4.2 递推法

递推法就是在已知某个结果的前提下,根据已经给出的(或者是分析总结出的)递推公 式,推出下一个结果的方法。

【例 4.26】有斐波那契数列(Fabonacci),已知前两个数分别是 1、1,从第三个数据开始 每个数据都是其前两个数据的和,编写程序,输出该数列的前 12 个数。

分析:我们用 A、B 分别表示前两个数。由于从第三个数开始每个数都是其前两个数的和,

所以如果仍然用 A、B 表示第三、四个数,则有:

A = A + B B = B + A ↑ ↑ ↑ 第 3 个数 第 1 个数 第 2 个数 第 4 个数 第 2 个数 第 3 个数 因此,我们得到的递推公式为:

A=A+B B=B+A

为了简单直观起见,假设程序中我们用 A,B 表示数列的递推数据,“计算”命令按钮的 程序源代码如下:

Private Sub cmdStart_Click() Dim A%, B%, I%

A = 1: B = 1 Print A, B For I = 2 To 6 A = A + B B = B + A Print A, B Next I

End Sub

程序运行结果如图 4-34 所示。

图 4-34 例 4.26 的程序运行界面

【例 4.27】一个猴子摘了一堆桃子,第一天吃了一半,又多吃一个;第二天还是吃了一 半,又多吃一个。它每天如此,到第 5 天时只剩一个桃子了。编写程序,计算猴子第一天共摘 了多少个桃子?

分析:这个问题与上例正好相反,现在知道第 5 天有一个桃子问第一天有多少桃子?

因此,若用 Ti表示第 i 天的桃子数,则有:

i 1 Ti

T 1

 2  (i=1,2,…)

即: Ti=2×(Ti+1+1) (i=1,2,…)

由此例可知:

T5=1

T4=2×(T5+1)

=2×(1+1) ...

依此类推即可求得 T1

假设程序中我们用 T 表示每天的桃子数。

用循环控制执行 4 次 T=2*(T+1)即可。

控件的属性和作用如表 4-24 所示,程序运行结果如图 4-35 所示。

表 4-24 例 4.27 的属性设置

对象 属性 属性值 功能

Form1 Caption 例 4.27 猴子摘桃子 显示程序的名称

(名称) lblResult Label

Caption 显示计算结果

(名称) cmdStart CommandButton

Caption 计算 开始计算

CommandButton (名称) cmdClose 关闭窗口

图 4-35 例 4.27 的程序运行界面

“计算”命令按钮(cmdStart)的程序源代码如下:

Private Sub cmdStart_Click() Dim intPeach%, I%

intPeach = 1 For I = 1 To 4

intPeach = 2 * (intPeach + 1) Next I

lblResult.Caption = "猴子第一天共摘了 " & intPeach & " 个桃子"

End Sub

相關文件