枚举算法及程序实现 知识点题库

【加试题】有30个人,其中有男人、女人和小孩,他们在一家商场花去500元。已知,每个男人花20元,每个女人花30元,每个小孩子花10元。问男人、女人、小孩各为多少人?解决上述问题的VB程序如下,单击按钮Command1,列表框List1中输出结果。

Privvate Sub Command1Click( )

Dim man As Integer,woman As Integer,child As Intger,s As Integer

   For woman = 1 To 15

     Child = 30 – man – woman

     S = 20 * man + 30 * woman + 10 * child

     If  Then

        List1.AddItem Str(man) + Str(woman) + Str(child)

     End If

Next woman

       Next man

End Sub

【加试题】火柴棍可以拼成数字0~9,拼法如图a所示。

输入火柴棍的数量n(n≤24),计算可以拼出多少个“A+B=C”的等式?

要求:

①加号与等号各自需要两根火柴棍。

②A,B,C为非负的整数,且该数非零时,最高位不能是0。

③如果A≠B,则A+B=C与B+A=C视为不同的等式。

④n根火柴棍必须全部用上。

小明发现,数字1用的火柴棍最少,24根火柴棍全部用上的话,能拼出最大的整数A或B不超1111,C不超过2222,他编写了一个VB程序,在文本框Text1中输入火柴棍的数量,单击“统计”按钮Command1,在文本框Text2中输出“A+B=C”的方案数,程序界面如图b所示。

实现上述功能的VB程序如下,请回答下列问题:

  1. (1) 请在画线处填入合适的代码。

    Private Sub Command1_Click()

    Dim a(0 T0 2 222)As Integer        ‘存储每个整数需用的火柴棍数

    Dim n As Integer,ans As Integer

    Dim i As Integer,j As Integer

    n=Val(Text1.Text)

    For i=0 To 2 222

       a(i)=0

      Next i

    ‘得到0~9中每个数字需用的火柴棍数

      a(0)=6:a(1)=2:a(2)=5:a(3)=5:a(4)=4

      a(5)=5:a(6)=6:a(7)=3:a(8)=7:a(9)=6

      n=    ①       ‘去掉等号与加号后,剩余的火柴棍数量

      For i=10 To 222  ‘计算出10~n中每个数字需用的火柴棍数

        a(i)=a(    ②    )+a(i Mod 10)

    Next i

    ans=0

     ‘枚举0~n中任意两个数,判断是否符合A+B=C的火柴棍数量

    For i=0 To 1 111

        For j=0 To 1 111

        If a(i)+a(j)+a(    ③    )=n Then

          ans=ans+1

        End If

        Next j

      Next i

      Text2.Text=Str(ans)

    End Sub

     ② ③ 

  2. (2) 输入的火柴棍的数量为14时,方案数为
水仙花数是指一个三位数,它的各位数的立方和正好等于该数本身。如:

153=1×1×1+5×5×5+3×3×3

小张设计了一个算法来输出所有的水仙花数,具体程序如下。

  1. (1) 在程序中常见用于解决问题的方法有解析法、穷举法、递归法等,本题中使用了哪种方法?
  2. (2) 程序中定义了几个变量?
  3. (3) 将程序中①的代码补充完整。
  4. (4) 将程序中②的代码补充完整。
  5. (5) 在for循环结构中,循环体执行的次数是多少?
  6. (6) 在本题中变量c主要用来存放这个三位数中的百位、十位还是个位上的数?
某密码强度判断程序功能如下:在文本框Text1中输入由大写字母、小写字母、数字和其它字符4种不同类型字符组成的密码字符串,单击“判断”按钮Cmdl,在标签框Label3 中显示判断结果。程序运行界面如图所示。

密码强度判断条件如下:密码长度小于6,则强度为“弱”。在密码长度大于等于 6 的情况下,若只出现一种字符,则密码强度为“弱”;若出现两种不同字符,则密码强度为“中”,出现3种以上不同字符,则密码强度为“强”。

  1. (1) Cmd1对象属于类。(单选,填字母:A .Label / B .TextBox / C .CommandButton)。
  2. (2) 实现上述功能的 VB 程序如下,请在划线处填入合适的代码。

    Private Sub Cmd1_Click()

    Dim n As Integer, i As Integer, m As Integer, s As String, c As String

    If n < 6 Then

        Label3.Caption = "弱"

    Else

        s = "0000"

        For i = 1 To n

        c = Mid(Text1.Text, i, 1)

        If c >= "0" And c <= "9" Then

            Mid(s, 4, 1) = "1"   '将字符串 s 第 4 位上的字符替换为"1"

        ElseIf c >= "A" And c <= "Z" Then

          Mid(s, 3, 1) = "1"

        ElseIf c >= "a" And c <= "z" Then

        Else

          Mid(s, 1, 1) = "1"

        End If

        Next i

        m = 0

        For i = 1 To 4

          If Mid(s, i, 1) = "1" Then  

        Next i

        If m < 2 Then

          Label3.Caption = "弱"

        ElseIf m = 2 Then

          Label3.Caption = "中"

        Else

          Label3.Caption = "强"

        End If

    End If

    End Sub

  3. (3) 若文本框 Textl 中输入的内容为“a26$gh2!”,单击“判断”按钮 Cmd1,事件过程运行结束时,变量 s 的值为
对称字符串的特征是从左到右读和从右到左读是完全一样的。如“abba”是对称的,“abcba”也是对称的。判断字符串是否对称的VB程序段如下:

n=Len(s)          's是待判断的字符串

k=0:j=n

For i=1 to n/2

   

Next i

If  k=0  Then Label1.Caption="对称"  Else  Label1.Caption="不对称"

方框中的代码由以下三部分组成:

①j=j-1

②If c1 <> c2 Then k = k+1

③c1=Mid(s,i,1) : c2=Mid(s,j,1)

代码顺序正确的选项是(  )

A . ①②③ B . ②③① C . ③②① D . ②①③
有如下VB程序段:

Dim a(1 to 5) as Integer, i as Integer, c as Integer

a(1) = 2 : a(2) = 1 : a(3) = 3 : a(4) = 4 : a(5) = 5

c = 0

For I = 3 to 5

If a(i - 2) + a(i - 1) = a(i) Then c = c + 1

Next i

Text1.Text = Str(c)

该程序运行后,文本框text1中显示的内容是(  )

A . 1 B . 2 C . 3 D . 4
平面上有n(3<=n<=100)个房间围成一圈,编号分别为 1~n,相邻的两个房间之间均有一扇门,第i个房间最多居住人数为a(i)。初始时选择一个房间,将所有人都聚集在该房间,接着每个人都可以顺时针方向走到相邻的房间,直到找到居住的房间。最后每个房间刚好住满。一个人每经过一扇门花费1的能量,请确定初始房间及每个人找房间的方案,使得所有人花费的能量的和最小。

例如:n = 5,a(1)= 4,a(2)= 7 ,a(3)= 8,a(4)= 6,a(5)= 4。

最佳方案为初始时所有人聚集在2号房间花费的最小能量为7*0+8*1+6*2+4*3+4*4=48。

实现上述功能的 VB 代码如下,但加框处代码有错,请改正。

Dim a( 1 To 100) As Integer   '依次存储编号为 1 到 100 的房间的最多居住人数

Private Sub Form_Load()

'产生N的值

'本过程从数据库中依次读取编号为1到 N的房间的最多居住人数,并存储在数组a中

'代码略

End Sub

Private Sub Command1_Click()

Dim i As Integer, j As Integer, w As Integer

Dim t As Long, ans As Long

ans = 32767

For i=1 To n

     t = 0

     For j=0 To n-1

            ‘(1)

      If w=0 Then w=n

           ‘(2)

   Next j

   If t < ans Then ans = t

Next i

Text2.Text = Str(ans)

End Sub

以上程序段运行时,为了实现上述功能,加框处代码应改正为:

;⑵

有趣的进制数:编写VB程序找出符合条件的十进制自然数,该自然数的七进制与九进制都是三位数,且七进制与九进制的三位数码顺序正好相反,输出这个十进制数与对应的七进制和九进制数。程序运行界面如图所示。

实现上述功能的VB程序如下,请在划线处填入合适的代码。

Private Sub Command1_Click()

  Dim i As Integer, d As Integer, r As integer

  Dim rs As string, ans1 As Integer, ans2 As Integer

  For i=81 To 342

    ①

    rs=“”

    Do While d <>0

      r = d Mod 9

      rs= str(r)+rs

      ②

    Loop

    ans1= Val(rs)

  ‘求出相应的七进制数,存储在变量ans2中,代码略

    If ans1 Mod 10=ans2\ 100 And ans1\ 100=ans2 Mod 10 And ③ Then

      Text1. Text=④

      Text2 Text= Str(ans1)

      Text3. Text= Str(ans2)

    End If

  Next i

End Sub

“奔跑吧,兄弟”栏目组要在全国各地挑选节目录制的地点。有来自K(1<=K<=25)个不同省份的N(K<=N<=100)个地区送来了各自的竞选材料。由于参选地区太多,没有办法同时呈现所有材料供评委进行选择。栏目组决定选择一段连续区间内的参选地区,这个区间内每个省份的参选地区至少要有1个,求满足要求的最小区间长度。

参选地区用数字1,2,3……N表示,每个地区所属的省份依次存入数组a(1)到a(N),若1号地区的省份编号是3,即a(1)=3。分析可知,所求区间的长度至少为K(省份的数量),最大为N(地区的数量)。我们可以通过二分K到N之间的数求得最小区间长度。例如有10个参选地区,分别来自于5个不同的省份,从左到右排列,地区编号依次为2,1,2,4,3,3,5,5,3,5,则最小的一段包含所有5个地区的区间是从第2个到第7个地区,区间长度为6。

  1. (1) 若有12个参选地区,分别来自于6个不同的省份,从左到右排列,地区编号依次为2,1,6,4,6,3,1,2,3,5,5,4,则最小的区间长度为
  2. (2) 请在划线处填入合适的代码。

    Dim a(1 To 100) As Integer, K As Integer, N As Integer

    Private Sub Form_Load()

    ‘产生N的值,表示地区数,产生K的值,表示省份数

    ‘产生编号为1到N的地区的省份编号,并存储在数组a中

    ‘代码略

    End Sub

    Private Sub Command1_Click()

    Dim M As Integer

    i = K: j = N

    Do While i <= j

     

     If bh(M) = True Then

      j = M -1

      ans = M

     Else

      i = M+1

     End If

    Loop

    Text1.Text = Str(ans)

    End Sub

    Function bh(M As Integer) As Boolean

    Dim f(1 To 25) As Integer     ‘f(i)表示是否包含省份为i的地区

    Dim t As Integer

    bh= False

    For i = 1 To N-M + 1     ‘枚举以i为起点的M个地区中各个省份是否都包含

     For j =

      f(a(j)) = 1

    Next j

    t= 0

    For j = 1 To K

     

    Next j

    If t = K Then bh= True: Exit Function

    For j = 1 To K

     f(j) =0

     Next j

    Next i

    End Function

七灯游戏是一款经典的益智类游戏。游戏中,有七盏灯排成一圈,如图a所示,初始时灯的开关状态随机生成,操作其中某一盏灯,则可以切换该灯的“开/关”状态,同时,这盏灯对面的两盏灯也会切换“开/关”状态,如图b所示:

图a为初始状态,操作圈中的灯,则该灯与对面的两盏灯都会切换“开/关”状态,如图b所示。假设这些灯的编号为0到6号,“开/关”状态随机产生,并输出到列表框List1中,接着需要从中选出数盏灯进行操作,使得最后所有灯都打开(已证明方案-一定存在且唯一), 并在列表框List2中输出灯的编号。

程序采用枚举策略,一一尝试对每盏灯状态进行“切换”操作,“1”表示对当前灯进行切换,“0”表示不操作。

程序运行界面如图c所示。

  1. (1) 0-6号灯的初始状态为“关  关  关  开  关  关  开”,如对1号灯进行切换操作,对面随之切换灯的编号是:
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

    Dim a(0 To 6)As Integer,b(0 To 6) As Integer

    Private Sub Command1_Click()

      Dim i As Integer, x As Integer, pos As Integer

      Dim flag As Boolean

      List2.Clear

      For i = 0 To

        x = i:pos = 0:flag = True

        For j = 0 To 6

            b(j)= a(j)

        Next j

        Do While x > 0

            If x Mod 2 = 1 Then

                b(pos)= 1 - b(pos)

                b((pos + 3) Mod 7) = 1 – b((pos + 3) Mod 7)

               

            End If

            pos = pos + 1

            x = x \ 2

         Loop

         For j = 0 To 6

             IfThen flag = False:Exit For

         Next j

         If flag Then

            pos = 0

            Do While i > 0

               If i Mod 2 = 1 Then List2.AddItem “第” + CStr(pos)+ “号”

               i = i \ 2

               pos = pos + 1

            Loop

            Exit For

         End If

       Next i

    End Sub

    Private Sub Form_Load()     ‘随机生成初始数据

        Dim i As Integer

        Randomize

        List1.Clear

        For i = 0 To 6

            a(i)= Int(Rnd * 2)

            If a(i)= 1 Then

                List1.AddItem “第” + CStr(i) + “号:”+ “开”

            Else

                List1.AddItem “第” + CStr(i) + “号:” + “关”

            End If

         Next i

    End Sub

列出所有可能的情况,逐个判断有哪些符合问题所要求的条件,从而解决问题,这是(   )思路
A . 递归算法 B . 顺序查找算法 C . 穷举法 D . 解析法
编写“素数查找”程序,实现如下功能:单击“生成”按钮,随机生成50个150至200(包括150和200)之间的正整数,显示在下方,每行显示10个,共5行。单击“筛选”按钮,从上面50个数中筛选出是素数的数,重复的只显示一次。程序运行界面如图所示。

请根据算法将下列程序补充完整。

Private Sub Command1_Click()

    Label3.Caption = ""

    For i = 1 To 50

        a(i) =

        If i Mod 10 = 0 Then

            Label3.Caption = Label3.Caption + CStr(a(i)) + vbCrLf '换行

        Else

            Label3.Caption = Label3.Caption + CStr(a(i)) + " "

        End If

    Next i

End Sub

Private Sub Command2_Click()

    Label4.Caption = ""

    n = 0

    For i = 1 To 50

        For k = 2 To a(i) - 1

            If Then Exit For

        Next k

        If k = a(i) Then

            n = n + 1

        If n = 1 Then b(n) = a(i)

        For j = 1 To n - 1

            If b(j) = a(i) Then: Exit For

            If j = n - 1 Then b(n) = a(i)

        Next j

    End If

Next i

For j = 1 To n

    Label4.Caption = Label4.Caption + + " "

Next j

用蒙特卡洛法求圆周率PI的近似值,其算法如下:使用随机函数Rnd,随机生成两个[0,1)之间的随机数,由此构成一个投点坐标(x, y),然后根据x2+y2<=1投点是否在圆内来求PI的近似值。其中总共随机投点n次,统计落点在单位圆内的点数为s,则4s/n即为所求PI的近似值。程序界面如图所示,在Text1中输入投点的个数,单机“计算”按钮,PI的近似值结果显示在Text2中。)

  1. (1) 要使得按钮的文字显示为“计算”,应该修改该对象的属性。
  2. (2) 要实现上述功能,请在划线处填入合适代码。

        Private Sub Command1_Click()

        Randomize             '随机数初始化

        Dim i As Long, n As Long, s As Long

        Dim x As Double, y As Double, z As Double

        n = Val(Text1.Text)

           ①

        s = 0

        Do While i <= n              '随机投点n次

            x = Rnd: y = Rnd

            z =       ②

            If z <= 1 Then

                s = s + 1

            End If

            i = i + 1

        Loop

    Text2.Text =     ③

若一个正整数从左向右读与从右向左读都一样,我们就将其称之为回文数。如11、121均是回文数。请你编写程序,输出10至n之间的所有回文数。程序运行界面如图所示,在文本框Text1中输入一个正整数n,单击“查找”按钮Command1,在列表框List1中显示10–n之间的所有回文数,并且在标签Label1中输出查找到回文数的总数。

问题:实现上述功能的VB 代码如下,但加框处代码有错,请改正。

Private Sub Command1_Click()

    Dim n as long , sum as long , i As Long Dim x as long , y as long

    List1.Clear

    n = Val(Text1.Text) sum = 0

    For i = 10 To n

        x =               ‘①

        y = 0

        Do While x > 0

            y =         ‘②

            x = x \ 10

        Loop

        If y = i Then

            List1.additem Str(i)

            sum = sum+1

        End if

    Next i

Label1.caption = “共有”& Str(sum) & “个回文数” End Sub

下列问题中适合使用枚举算法解决的是(    )
A . 已知5个电阻阻值,求它们并联后的阻值 B . 银行贷款买房后每月还货金额的计算 C . 查找100以内所有能被6整除的数 D . 已知某同学的身高和体重,判断体重指数的等级
水仙花数也被称为超完全数字不变数,是指一个3位数,它的每个位上的数字的3次幂之和等于它本身(例如:13+53+33=153)。课堂上老师布置作业要求用VB编写一个程序,找出所有的水仙花数,下面是小丽同学完成的作业,其中有几处错误,请帮她修改。

Private Sub Command1_Click()

    Dim i As Long, j As Long, k As long

    Dim As long

    For i=0 To 9

        For j=0 To 9

            For k=0 To 9

                s=i*100+j*10+k

                If(i^3)+(j^3)+(k^3)=s Then

                    Debug. Print s

                End If

            Next k

        Next j

    Next i

End Sub

  1. (1) 修改“Dim As Long”行中的错误;
  2. (2) 修改“For i=0 To 9”行中的错误;
  3. (3) 修改“If(i^3)+(j^3)+(k^3)= s Then”行中的错误;
在VB中,下列程序段执行后,变量a,b,c的值分别是(   )

a=1: b=1:c=1

do while a+b+c<=10

    a=a+1

    b=b*2

    c=b/2

loop

A . 2,2,1 B . 3,4,2 C . 4,8,4 D . 4,4,2
阅读材料,完成下题。

用计算机对《红楼梦》进行词频统计的研究,用计算机模拟水稻高产栽培的模型,“神州飞船”发射指挥中心使用大量的计算机设备对飞船的指挥和控制等等,无不体现计算机的魅力和神秘莫测!计算机像人类的大脑一样充满智慧,像神仙一样神机妙算,这些都是归于计算机程序的功劳。

  1. (1) 关于用计算机程序解决问题的步骤,正确的是                 
    A . 设计算法、编写程序、提出问题、调试程序、得到答案 B . 分析问题、编写程序、设计算法、调试程序、得到答案 C . 分析问题、设计算法、编写程序、调试程序、得到答案 D . 设计算法、提出问题、编写程序、调试程序、得到答案
  2. (2) 使用VB程序设计语言编写可以编写模拟飞行仿真程序,实现各种飞行训练功能。VB程序设计语言属于               
    A . 汇编语言 B . 机器语言 C . 低级语言 D . 高级语言
  3. (3) 程序有三种最基本的结构,分别是顺序结构、                和循环结构。
    A . 控制结构 B . 分支结构 C . 选择结构 D . 多分支结构
  4. (4) 在Visual Basic程序设计语言中,定义字符串类型的是               
    A . Integer B . Single C . String D . Boolean
  5. (5) 穷举法的适用范围是               
    A . 一切问题 B . 解的个数极多的问题 C . 解的个数有限且可一一列举的问题 D . 不适合设计算法的问题
某校内活动需要n(1≤n≤10)名学生迎宾,要求是:男女生站成一排,男生不能相邻,男女生比例大于1/2。考虑到方案只包含了男和女两种情况,可以用二进制的0来代替女生,1来代替男生。当全部是0时最小,此数为0;当全部是1时最大。枚举从0到最大数的每一种情况,逐一判断是否包含男生相邻(二进制1相连),符合的0、1转换为女、男后输出,并在此基础上输出男女生比例较合适的方案(男:女>1/2)。

按上述要求,编写VB程序,功能如下:在文本框Text1中输入n的值,点击“开始枚举”按钮Command1,在列表框List1中输出所有方案,在列表框List2中输出比例合适方案。

实现上述功能的VB程序如下,回答下列问题:

  1. (1) 如果输入的n值等于4,那么男女比例合适的方案有种。
  2. (2) 请在划线处填入合适的代码。

    Dim n As Integer, Getstr As String

    Private Sub Command1_Click()

        Dim i As Integer, j As Integer, mAs Integer

        n = Val(Text1.Text)

        Getstr = ""

    For i = 0 To 2 ^ n -1

            m = i

            If Then

                For j = 1 To n

                    If m Mod 2 = 0 Then

                        Getstr = "女" + Getstr

                    Else

                        Getstr = "男" + Getstr

                    End If

                    m = m \2

                Next j

                List1.AddItem Getstr

                If Team(Getstr) <> "" Then List2.AddItem (Team(Getstr))

                Getstr =""

            End If

        Next i

    End Sub

    Function search(i As Integer) As Boolean '判读男生是否相邻

        Dim j As Integer,t As Integer

        Dim a(1 To 15) As Integer

        t = i

        For j = 1 To n

            a(j) = t Mod 2

            t = t \2

        Next j

        flag = True

        For k = 1 To n -1

            If Then flag = False: Exit For

        Next k

    search = flag

    End Function

    Function Team(ch As String) As String     '判读男女生比例是否合适

        Dim num As Integer, st As Integer, i As Integer,c(0 To 1) As Integer

        Team = “”

        For i = 0 To 1

            c(i) = 0

        Next i

        For i = 1 To n

            st= Mid(ch, i, 1)

            If st= "男" Then num=1: c(num)= c(num)+1 Else num =0: c(num)= c(num)+1

        Next i

        IfThen Team = ch

    End Function

课堂上老师给出题目:查找1000以内所有能被13整除并且末尾是5的自然数。下列算法最合适的是(      )。
A . 查找法 B . 排序法 C . 解析法 D . 枚举法