第2节 枚举算法
考试内容
考试要求
枚举算法思想
c
枚举算法程序实现
c
一、枚举算法思想
1.什么是枚举算法
根据问题的本身特点,一一列举出该问题的所有可能情况,并对可能情况进行逐一分析、判断是否满足条件,若满足,则它是问题的一个正确解,从而挑选出符合条件的所有解。
2.枚举算法的特征
枚举对象:枚举什么
枚举范围:连续的区间
条件判断:满足什么条件
二、利用枚举算法解决问题的基本思路
(1)分析枚举对象
分析题意,确定要枚举什么。
(2)确定枚举范围
枚举对象的范围要准确,不能扩大和缩小范围。
(3)得出判断条件
判断条件要书写规范,符合VB规则。
三、枚举算法算法框架及程序实现
1.算法框架
循环结构语句嵌套分支结构(分支结构也称选择结构)语句。
循环语句用来列举可能解的范围。
选择语句用来判断所列举的可能解的正确性。
2.枚举算法解题时需注意的方面
(1)枚举解时,既不能遗漏任何一个真正解,也不能有重复。
(2)条件判断时,利用问题提供的约束条件筛选、判断解的正确性。
(3)求解形式一般为输出解的内容或进行与解相关的其他计算。
一、枚举算法思想
理解枚举算法的基本思想,掌握枚举算法的适用场合。
【典例1】 下列问题中适合采用枚举算法解决的是( )
A.求三个数中的最大数
B.统计1000以内能被7整除但不能被3整除的自然数的个数
C.计算1~100的和
D.将一个十进制数转换为二进制数
解析 本题主要考查枚举算法的基本思想。显然,只有B选项符合枚举算法的基本思想,枚举对象为自然数,枚举范围为1~1000,枚举条件为:i mod 7=0 and i mod 3< >0,因此答案为B。
答案 B
【变式训练】 下列问题中适合采用枚举算法解决的是( )
A.求解一元二次方程的根
B.根据三角形三边长度,求三角形的面积
C.求100内所有素数
D.求三个数中的最大数
解析 本题主要考查枚举算法的基本思想。C选项符合枚举算法的基本思想,枚举对象为自然数,枚举范围为2~1000,枚举条件为“该数是素数”,因此答案为C。
答案 C
【方法总结】 理解枚举算法的基本思想,从而掌握枚举的适用场合。
二、枚举算法实例应用
【典例2】 某QQ群采用问题验证的加入方式,如图1所示。
图1
某同学设计了一个VB程序用于寻找这个以511开头、可被2015整除的6位数,单击计算按钮Command1,在标签Label2上显示答案,设计的窗体界面如图2所示。
图2
(1)在图2所示的窗体中,创建标签Label2对象的方法正确的是________(填字母)。
A.双击工具箱中的“”控件
B.双击工具箱中的“”控件
(2)要在窗体的标题栏上显示 “问题验证” 字样,是通过修改该窗体对象的 ________(填:Font / Caption / Text)属性值实现的。
(3)在代码编辑窗口中,输入“Label2.”后出现如图3所示的信息, 其中的“Autosize”是Label2的________(填:事件名 / 方法名 / 属性名)。
图3
(4)为了实现上述功能,在程序划线处填入正确的语句。
Private Sub Command1_Click()
Dim i As Integer, n As Long
For i = 0 To 999
________________________
If n Mod 2015 = 0 Then Label2.Caption = Str(n)
Next i
End Sub
解析 本题考查的是枚举算法思想以及程序的实现。此程序枚举的是6位数中的后3位,因此6位数为n=511000+i。
答案 (1)B (2)Caption (3)属性名 (4)n=511000+i
【变式训练1】 下列程序的功能是:在文本框Text1中输入一个正整数N(N>2),若该整数为质数(即素数),则在标签Label3中显示“IS Prime!”,否则显示“IS not Prime!”。
程序运行时,在文本框Text1中输入一个整数,单击“判断”按钮Command1,在标签Label3中显示结果。程序运行界面如下图所示。
实现上述功能的VB程序如下,请回答下列问题:
Private Sub Command1_Click()
Dim n As Long, i As Integer, flag As Boolean
n = Val(Text1.Text)
________①______
flag = True
Do While ________②______
If n Mod i = 0 Then
flag = False
Else
i = i + 1
End If
Loop
If flag Then Label3.Caption = “IS Prime!” Else Label3.Caption = “IS not Prime!”
End Sub
(1)观察程序运行界面,该图中共包含对象________个,分别属于________个类(填个数)。
(2)程序代码“Private Sub Command1_Click()”中的Command1是指________,Click是指________。
(3)在程序划线处填入合适的代码。
解析 (1)本题主要考查的是VB对象及VB控件类名。图中共包含1个窗体、3个标签、1个文本框、1个按钮对象,共6个对象,分属于标签类、按钮类、文本框类和窗体类。
(2)本题主要考查的是事件处理过程。事件处理过程“Private Sub Command1_Click()”中的Command1是指对象名,Click是指事件名。
(3)程序划线①处为i初值,从质数的定义可知i=2;②处为循环条件,表示整数n还未判断完毕且当前还不是质数,因此②处语句为i <= n - 1 And flag = True或i<=Int(Sqr(n)) And flag=True。
答案 (1)6 4 (2)对象名 事件名
(3)①i = 2 ②i <= n - 1 And flag = True 或i <=Int(Sqr(n)) And flag = True,说明flag = True可写为flag
【变式训练2】 有一个七位数,形如6600**0,头两位均为6,其中十位和百位已模糊不清,且该数是64或24的倍数,求该整数的所有可能情况,并统计符合条件的整数个数。
实现上述功能的VB程序如下,请回答下列问题:
Private Sub Command1_Click()
Dim i As Long, x As Long, count As Integer
count = 0
For i = 10 To 99
x = ________①______
If __________②________Then
List1.AddItem Str(x)
count = count + 1
End If
Next i
List1.AddItem Str(count)
End Sub
(1)程序代码“List1.AddItem x”中的AddItem是指List1对象的________(填:属性/方法/事件)。
(2)在程序划线处填入合适的代码。
解析 (1)本题主要考查的是对象的方法。AddItem是指List1对象的方法。
(2)变量x表示七位数整数,枚举两位模糊的整数i,因此x=6600000 + i * 10;该数是64或24的倍数,用VB表达式表示为x Mod 64 = 0 Or x Mod 24 = 0。
答案 (1)方法 (2)①6600000 + i * 10
②x Mod 64 = 0 Or x Mod 24 = 0
【方法总结】 (1)要注意枚举范围的精确性,不能扩大和缩小,否则会影响结果。(2)条件表达式书写要规范,注意与数学代数式的区别。
1.有如下程序段:
Dim i As Integer, ans As Integer
Dim a(1 To 10) As Integer
sum = 0
For i = 1 To 10
a(i) = i ^2
If a(i) Mod 3 = 0 Then ans = ans + a(i)
Next i
Text1.Text = Str(ans)
该程序段运行后,文本框Text1中显示的内容是( )
A.55 B.126
C.259 D.385
解析 本题的本质是求1~10的平方数中3的倍数之和。本题采用枚举算法思想,枚举范围为1~10,枚举对象为a(i)(即i的平方数),条件为“a(i)是3的倍数吗?”,当i=3、6、9时,a(3)=9、a(6)=36、a(9)=81满足条件,因此ans=9+36+81=126,答案为B。
答案 B
2.水仙花数。所谓水仙花数是指一个三位整数,每一位上数字的立方和等于该数本身,这样的数称为水仙花数。
程序运行时,单击“求解”按钮,则在列表框List1中输出所有的水仙花数,并在列表框最后显示水仙花数的数量。程序运行效果如下图所示。
实现上述功能的VB程序如下,请回答下列问题:
Private Sub Comm1_Click()
Dim i As Integer, a As Integer, b As Integer, c As Integer
Dim s As Integer, count As Integer
count = 0
For i = 100 To 999
______①______
b = i 10 Mod 10
c = i 100
s = a ^ 3 + b ^ 3 + c ^ 3
If s = i Then
List1.AddItem Str(i)
count = count + 1
End If
Next i
List1.AddItem “共有水仙花数:” +____②____+ “个”
End Sub
(1)“求解”按钮的名称为________。
(2)在程序划线处填入合适的代码。
解析 (1)本题主要考查的是对象的名称,根据代码“rivate Sub Comm1_Click()”可知,“求解”按钮的名称为Comm1。
(2)根据代码“s = a ^ 3 + b ^ 3 + c ^ 3”可知,①处为关于变量a的赋值语句,变量存储整数i的个位,因此为a = i Mod 10;变量count存储水仙花数的个数,最后在列表框List中输出,需注意的是要加Str函数。
答案 (1)Comm1 (2)①a = i Mod 10 ②Str(count)
基础巩固
1.有如下VB程序段:
For i = 1 To 30
If i Mod 2 = 0 And i Mod 3 = 0 Then
s = s + i
List1.AddItem Str(i)
End If
Next i
该程序段执行后,变量s的值为________。
解析 本程序的功能是统计30以内6的倍数之和。显然,s=6+12+18+24+30=90。
答案 90
2.编写VB程序,实现如下功能:有一个五位数,此五位数的万位和个位上的数字分别是2和5,而且这个五位数是一个完全平方数。现要找出符合上列要求的所有五位数,并统计共有几个数。
单击“寻找”按钮Command1,将符合要求的五位数显示在列表框List1中,统计个数显示在标签Label2中。界面如下图所示。
(1)在设计应用程序界面时,要使按钮Command1上显示“寻找”,则应修改其________属性的属性值。
(2)为实现上述功能,请在划线处填入合适的代码。
Private Sub Command1_Click()
Dim i As Integer, x As Integer, n As Integer
For i = 0 To 999
______①______
If Int(Sqr(x)) = Sqr(x) Then
List1.AddItem Str(x)
______②______
End If
Next i
Label2.Caption = “共有:” + Str(n) + “个”
End Sub
解析 (1)本题主要考查的是对象的属性。(2)变量x表示五位数,因此①处代码为x=20005+i*10;②处表示统计满足条件的五位数个数,因此为n=n+1。
答案 (1)Caption (2)①x=20005+i*10
②n=n+1
能力提升
3.现有一堆苹果需要装盒销售,现有大小两种规格的盒子,小盒每盒可装10个苹果,大盒每盒可装15个苹果。苹果装盒的要求如下:要求大小盒子都要使用(至少使用1个),且每盒都必须装满,计算出所有的装盒方案,并统计出方案数。
小明编写了一个苹果装盒的VB程序,程序运行时,在文本框Text1中输入苹果总数,单击“计算”按钮,如有方案,则在列表框List1中显示具体的装盒的方案,在标签Label4中显示方案总数,否则在列表框List1中显示“无方案”。程序运行界面如图所示。
实现上述功能的VB程序如下,但程序加框处语句有错,请改正。
Private Sub Command1_Click()
Dim i As Long, j As Long, count As Long, n As Long
count = 0
n = Val(Text1.Text)
List1.Clear
For i = 1 To n 10
For j = 1 To n 15
If Then ′①
count = count + 1
List1.AddItem “方案” + Str(count) + “:” +Str(i) + “ ” + Str(j)
End If
Next j
Next i
If Then ′②
Label4.Caption = Str(count)
Else
List1.AddItem “没有方案!”
End If
End Sub
程序中加框①处应改正为__________________________________________;
加框②处应改正为_________________________________________________。
解析 本题主要考查的是枚举算法。①处语句主要考查表达式书写的规范性,特别要注意乘号不能省略,①处语句应改为:i * 10 + j * 15 = n 或i * 10 + j * 15 =Val(Text1.Text);根据Then后面的语句可知,②处条件为有方案的情况,因此②处语句应修改为count>0或count< >0。
答案 ①i * 10 + j * 15 = n 或i * 10 + j * 15 =Val(Text1.Text)
②count>0或count< >0
4.下列VB 程序用于删除数据序列中的重复数据(即相同的数据仅保留一个)。程序运行时,在列表框 List1 中显示数组 a 中的原始数据,单击“去重”按钮 Command1,在列表框 List2 中输出“去重”后的数据,同时在标签 Label3 中显示删除的数据总个数。
程序运行的界面如下图所示:
程序代码如下,将空白处补充完整。
Const maxn = 10
Dim a(1 To maxn) As Integer
Private Sub Command1_Click()
Dim i As Integer, c As Integer
Dim flag(1 To maxn) As Boolean
c = 0
For i = 1 To maxn
flag(i) = False
Next i
For i = 1 To maxn
If flag(i) = False Then
For j = i + 1 To maxn
If____①____Then flag(j) = True:
c=c+1
Next j
End If
Next i
For i = 1 To maxn
If____②____Then List2.AddItem Str(a(i)) ′
Next i
Label3.Caption = “共删除重复数据:” & Str(c) & “个”
End Sub
解析 变量flag(i)表示是否有重复,如果有重复,值为True。判断a(i)是否有重复的思路是j从i的下一个位置开始,a(i)与a(j)比较,如果相等,表示与他重复,打上标记,让flag(j)成为True。 最后根据flag 的值输出不重复的数。
答案 ①a(i)= a(j) ②flag(i) = False
课件22张PPT。第2节 枚举算法一、枚举算法思想
1.什么是枚举算法根据问题的本身特点,一一列举出该问题的所有可能情况,并对可能情况进行逐一分析、判断是否满足条件,若满足,则它是问题的一个正确解,从而挑选出符合条件的所有解。2.枚举算法的特征枚举对象:枚举什么
枚举范围:连续的区间
条件判断:满足什么条件二、利用枚举算法解决问题的基本思路(1)分析枚举对象
分析题意,确定要枚举什么。
(2)确定枚举范围
枚举对象的范围要准确,不能扩大和缩小范围。
(3)得出判断条件
判断条件要书写规范,符合VB规则。三、枚举算法算法框架及程序实现
1.算法框架循环结构语句嵌套分支结构(分支结构也称选择结构)语句。循环语句用来列举可能解的范围。
选择语句用来判断所列举的可能解的正确性。2.枚举算法解题时需注意的方面(1)枚举解时,既不能遗漏任何一个真正解,也不能有重复。
(2)条件判断时,利用问题提供的约束条件筛选、判断解的正确性。
(3)求解形式一般为输出解的内容或进行与解相关的其他计算。一、枚举算法思想理解枚举算法的基本思想,掌握枚举算法的适用场合。【典例1】 下列问题中适合采用枚举算法解决的是( )A.求三个数中的最大数
B.统计1000以内能被7整除但不能被3整除的自然数的个数
C.计算1~100的和
D.将一个十进制数转换为二进制数解析 本题主要考查枚举算法的基本思想。显然,只有B选项符合枚举算法的基本思想,枚举对象为自然数,枚举范围为1~1000,枚举条件为:i mod 7=0 and i mod 3< >0,因此答案为B。答案 B【变式训练】 下列问题中适合采用枚举算法解决的是( )A.求解一元二次方程的根
B.根据三角形三边长度,求三角形的面积
C.求100内所有素数
D.求三个数中的最大数
解析 本题主要考查枚举算法的基本思想。C选项符合枚举算法的基本思想,枚举对象为自然数,枚举范围为2~1000,枚举条件为“该数是素数”,因此答案为C。
答案 C【方法总结】 理解枚举算法的基本思想,从而掌握枚举的适用场合。二、枚举算法实例应用
【典例2】 某QQ群采用问题验证的加入方式,如图1所示。图1某同学设计了一个VB程序用于寻找这个以511开头、可被2015整除的6位数,单击计算按钮Command1,在标签Label2上显示答案,设计的窗体界面如图2所示。图2(1)在图2所示的窗体中,创建标签Label2对象的方法正确的是________(填字母)。(2)要在窗体的标题栏上显示 “问题验证” 字样,是通过修改该窗体对象的 ________(填:Font / Caption / Text)属性值实现的。
(3)在代码编辑窗口中,输入“Label2.”后出现如图3所示的信息, 其中的“Autosize”是Label2的________(填:事件名 / 方法名 / 属性名)。图3(4)为了实现上述功能,在程序划线处填入正确的语句。
Private Sub Command1_Click()
Dim i As Integer, n As Long
For i = 0 To 999
________________________
If n Mod 2015 = 0 Then Label2.Caption = Str(n)
Next i
End Sub解析 本题考查的是枚举算法思想以及程序的实现。此程序枚举的是6位数中的后3位,因此6位数为n=511000+i。
答案 (1)B (2)Caption (3)属性名 (4)n=511000+i【变式训练1】 下列程序的功能是:在文本框Text1中输入一个正整数N(N>2),若该整数为质数(即素数),则在标签Label3中显示“IS Prime!”,否则显示“IS not Prime!”。
程序运行时,在文本框Text1中输入一个整数,单击“判断”按钮Command1,在标签Label3中显示结果。程序运行界面如下图所示。实现上述功能的VB程序如下,请回答下列问题:
Private Sub Command1_Click()
Dim n As Long, i As Integer, flag As Boolean
n = Val(Text1.Text)
________①______
flag = True
Do While ________②______
If n Mod i = 0 Then
flag = False Else
i = i + 1 End If
Loop
If flag Then Label3.Caption = “IS Prime!” Else Label3.Caption = “IS not Prime!”
End Sub(1)观察程序运行界面,该图中共包含对象________个,分别属于________个类(填个数)。
(2)程序代码“Private Sub Command1_Click()”中的Command1是指________,Click是指________。
(3)在程序划线处填入合适的代码。解析 (1)本题主要考查的是VB对象及VB控件类名。图中共包含1个窗体、3个标签、1个文本框、1个按钮对象,共6个对象,分属于标签类、按钮类、文本框类和窗体类。
(2)本题主要考查的是事件处理过程。事件处理过程“Private Sub Command1_Click()”中的Command1是指对象名,Click是指事件名。
(3)程序划线①处为i初值,从质数的定义可知i=2;②处为循环条件,表示整数n还未判断完毕且当前还不是质数,因此②处语句为i <= n - 1 And flag = True或i<=Int(Sqr(n)) And flag=True。答案 (1)6 4 (2)对象名 事件名
(3)①i = 2 ②i <= n - 1 And flag = True 或i <=Int(Sqr(n)) And flag = True,说明flag = True可写为flag【变式训练2】 有一个七位数,形如6600**0,头两位均为6,其中十位和百位已模糊不清,且该数是64或24的倍数,求该整数的所有可能情况,并统计符合条件的整数个数。实现上述功能的VB程序如下,请回答下列问题:
Private Sub Command1_Click()
Dim i As Long, x As Long, count As Integer
count = 0
For i = 10 To 99
x = ________①______
If __________②________Then List1.AddItem Str(x)
count = count + 1
End If
Next i
List1.AddItem Str(count)
End Sub
(1)程序代码“List1.AddItem x”中的AddItem是指List1对象的________(填:属性/方法/事件)。
(2)在程序划线处填入合适的代码。解析 (1)本题主要考查的是对象的方法。AddItem是指List1对象的方法。
(2)变量x表示七位数整数,枚举两位模糊的整数i,因此x=6600000 + i * 10;该数是64或24的倍数,用VB表达式表示为x Mod 64 = 0 Or x Mod 24 = 0。
答案 (1)方法 (2)①6600000 + i * 10 ②x Mod 64 = 0 Or x Mod 24 = 0
【方法总结】 (1)要注意枚举范围的精确性,不能扩大和缩小,否则会影响结果。(2)条件表达式书写要规范,注意与数学代数式的区别。