用解析法和穷举法设计程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.1—4.2 用解析法、穷举法设计程序
【学习目标:】1、理解解析法和穷举法
2、分清两者之间的区别
在经过大量编程实践之后,人们总结出很多行之有效的算法来解决实际问题。
常用的方法有:解析法、穷举法、查找法、排序法、递归法等。
4.1 解析法
所谓解析法是指:通过分析问题中各要素之间的关系,用最简练的语言或形式化的符号来表达它们的关系,得出解决问题所需的表达式,然后设计程序求解问题的方法。
例1:求三角形面积
已知a、b、c分别为三角形的三条边长,利用海伦公式求该三角形面积
p=(a+b+c)/2
编程实现:输入边长a,b,c,如果能构成三角形,输出面积,否则输出“No Answer!”界面如下:
Dim a As Single , b As Single , c As Single
a=val(text1.text)
b=val(text2.text)
c=val(text3.text)
If then
p=(a+b+c)/2
s=sqr(p*(p-a)*(p-b)*(p-c))
text4.text=format(s,”0.00”) ‘结果保留两位小数
Else
text4.text=”no answer”
End If
根据上述回答下列问题(8分,每空4分)
(1)、利用海伦公式求三角形面积的算法是_____(解析法/查找法/枚举法/排序法)。
(2)、填写出参考程序中空白处的表达式________(填写字母:A/B/C/D)
A、a + b > c or a + c > b and b + c > a
B、a + b > c or a + c > b or b + c > a
C、a + b > c and a + c > b or b + c > a
D、a + b > c and a + c > b and b + c > a
(1)解析法(2)D
用解析法求解问题,许多时候并非只是计算一个解析式就可以完事,还要根据问题给出的已经条件,运用归纳、演绎等逻辑方法,揭示问题各要素之间的关系,寻找表示这种关系的表达式,有时需要计算的解析式是一组而不仅仅是一条。
例子2、GDP增长问题
某省2016年的GDP是6.7万亿元,如果每年按7%的比例增长,问多少年以后此省的GDP超过15万亿?
【算法分析】
假设n年后此省的GDP超过15万亿元,根据题意得出数学关系式?求最小的n。
【参考程序】
Dim p As Single ‘ p用于记录GDP的值
Dim r As Single ‘ r用于记录GDP的年增长比例
Dim n As Integer ‘用于统计年数
p=6.7
r=0.07
n=0
Do while ____________
p=p*(1+r)
n=n+1
Loop
Print n_”年后,GDP的值超过15万亿元。
”
根据上述回答下列问题:(共6分,每空3分)
(1)本题采用的算法是__________(填写:解析法/枚举法/排序法/递归法)。
(2)写出程序中空白处表达式____________________________
(1)解析法(2)p<=15
4.2 穷举法
穷举法也称为枚举法,这种算法是把问题设计的可能情况一一罗列出来,并且根据题目的条件和实际背景逐个做出判断,从中挑选出符合条件的解答。
例子1、勾股数
勾股数是指满足条件a2+b2=c2的自然数,求出100以内满足a<b的所有勾股数。
【算法分析】
a的取值范围[1,100];
b的取值范围[1,100];
c的取值范围[1,100].
【参考程序】
Dim a As Integer,b As Integer,c As Integer
For a=1 To 100
For b=1 To 100
For c=1 To 100
If _________________Then
Print a;b;c ‘abc之间以分号分隔
End If
Next c
Next b
Next
(1)本题采用的算法是___________(填写:解析法/枚举法/排序法/递归法)。
(2)程序代码中空白处应填写的条件是_____________(填写字母:A/B/C/D)A、a<b And a2+b2=c2 B、a<b Or a2+b2=c2
C、a<b And a^2+b^2=c^2
D、a<b Or a^2+b^2=c^2
(1)枚举法(2)C
使用穷举法时,要恰当地设计变量,并且决定用哪些变量作为搜索的主线,以便穷举出所有可能的情况。
穷举一般使用循环结构,要注意循环的起点和终点,对可能的情况不能遗漏,一般也不应重复。
编制程序时,还应当根据题目要求准确地写出是否符合条件的判断语句。
例子2、换钱问题
要将一张100元的钞票,换成等值的5元、2元、1元一张的钞票共50张。
其中一种换发如下:
5元:3张2元:38张1元:9张求出所有的换钱方案。
【算法设计】
x表示5元的张数:1≤x≤20;
y表示2元的张数:1≤y≤50;
z表示1元的张数:1≤z≤100.
【参考程序】
Dim x As Integer,y As Integer,z As Integer
For x=1 To 20
For y=1 To 50
For z=1 To 100
If _____________________Then
Print x;y;z ‘x y z 之间以分号分隔
End if
Next z
Next y
Next x
根据上述回答下列问题:(8分,每空4分)
(1)本题采用的算法是_________________(填:解析法/枚举法/排序法/递归法)。
(2)程序代码中空白处应填写的条件是______(填写字母:A/B/C/D)。
A、5x + 2y + z=100 Or x + y + z = 50
B、5x + 2y + z=100 And x + y + z = 50
C、5*x + 2*y + z=100 Or x + y + z = 50
D、5*x + 2*y + z=100 And x + y + z = 50
(1)枚举法(2)D
解析法和枚举法最大的区别是:枚举法会舍弃一些不符合题意的数据。
比如枚举法计算能被3整除的数,从1开始一直枚举,1和2都不符合题意,都舍去,保留符合题意的
3 。
如果步骤中的任何数据都不能舍去,前一步计算的结果后一步要用的话,就是解析法
【随堂练习】
1、水仙花数是三位整数:其各位数字立方和等于该数本身,如153=1^3+5^3+3^3,如果要求出所有的水仙花数,下列算法最合适的是()
A、解析法
B、排序法
C、查找法
D、枚举法
2、某市出租车收费标准如下:
(1)3公里内(含3公里),收费8元;
(2)超过3公里但未超过6公里部分,按1.5元/公里收费;
(3)超过6公里部分,按2.25元/公里收费。
根据以上标准,输入出租车行驶的公里数,请计算顾客需付费多少元?
【算法分析】
假设总费用为p,则可以分段计算
p=8 (s≦3)
P=1.5*(s-3)+8 (3<s≦6)
P=2.25*(s-6)+1.5*3+8 (s>6)
【参考代码】
Dim s As Single ’s记录出租车行驶的公里数
Dim p As Single ’p记录总费用
s=Val(InputBox(“s=”)) ’读入出租车行驶的公里数
If s<=3 Then
p=8
End If
If ______________Then
p=1.5*(s-3)+8
End If
If s>6 Then
p=2.25*(s-6)+1.5*3+8
End If
Print p
根据上述回答下列问题:
(1)、本题采用的算法是__________(填写:解析法/查找法/枚举法/排序法)。
(2)、程序代码中空白处应填写的条件是____________(填写字母:A/B/C/D).
A、3<s≦6
B、3 ≦s≦6
C、s>3 And s<=6
D、s>3 Or s<=6
3、算法设计与程序实现
假设公鸡一只5钱,母鸡一只3钱,小鸡一钱3只。
现用100钱来买100只鸡。
问:公鸡、母鸡、小鸡各买多少只?(要求公鸡、母鸡、小鸡都是整数)
设计算法并编写程序输出所有的买鸡方案
Dim x As Integer, y As Integer, z As Integer
For x=0 To 20
For y=0 To 33
For z=0 To 99 Step 3
If____________________ Then
Print “公鸡:”x, “母鸡:” y,”小鸡:”z
Exit For
End If
Next z
Next y
Next x
End Sub
根据上述回答如下问题(共8分,每题4分)
(1)、本题采用的算法是_________(填写:解析法/枚举法/排序法/递归法)(2)、程序代码中空白处应填写的条件是___________(填:A/B/C/D)
A、x + y + z=100 AND 5x+3y+z/3=100
B、x + y + z=100 OR 5x+3y+z/3=100
C、x + y + z=100 AND 5*x+3*y+z/3=100
D、x + y + z=100 OR 5*x+3*y+z/3=100
4、人口增长问题
假设我国目前人口数为13亿,如果每年增长率为1.2%,填写程序,计算多少年后我国人口数超过20亿。
【算法分析】
设n年后,我国人口数超过20亿。
根据题意得出数学关系式:13*(1+1.2%)^n>20 ,求最小的n。
【参考程序】
Dim p as single,r as single, n as integer
P=13
r=0.012
n=0
Do while__________
n=n+1
p=p*(1+r)
Loop
Print n:”年后”:”人口超过”:p
根据上述回答下列问题(8分,每空4分)
(1)、本题采用的算法是__________(填写:解析法/枚举法/递归法)
(2)、写出参考程序中空白处表达式___________________
5、分析解决问题:
有一张单据,编号为四位数,号码为:8□□0,中间两位被污浊看不出来。
已知该单据能够被23和37整除,请编程求出该单据号码
【算法设计】
设百位数字为x,十位数字为y,x和y的范围都是0到9
4位数8xy0=8*1000+x*100+y*10
列举□□里的两个数字所有可能情况;
00,01,02,03,04,05,06,07,08,09
10,11,12,13,14,15,16,17,18,19
………
90,91,92,93,94,95,96,97,98,99
逐一判断找出符合条件的数字
【参考代码】:
Dim x as long ,y as long, n as long
For x=0 to 9
For y=0 to 9
n=8*1000+x*100+y*10
If then
Print n
End If
Next y
Next x
根据上述回答下面问题
(1)、解决该问题采用的算法是:(填:解析法/枚举法/排序法/递归法) (2)、根据题意程序中的空白处应该填写:(填:A/B/C/D)
A、n mod 23=0 OR n mod 37=0
B、n\23=0 AND n\37=0
C、n\23=0 OR n\37=0
D、n mod 23=0 AND n mod 37=0
(3)、根据算法设计,参考程序中循环体中的语句“n=8*1000+x*100+y*10”一共重复执行了多少次。
【参考答案】
1、D
2、(1)解析法(2)C
3、(1)枚举法“百鸡百钱”采用的一一举例试验的方法,故为枚举法。
(2)C 鸡的只数和钱数都是100,故用and连接。
4、(1)解析法(2)p<=20
5、(1)枚举法通过一一列举,试验所有的可能情况,故用的是枚举法。
(2)D 因为n能同时被23和37整除,所以用and连接两个条件。
(3)100 本题考查的是循环结构,利用两个for循环的嵌套,循环次数由x的变化次数*y的变化次数,即10*10=100.。