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

小刚的支付宝账户密码忘记了,但他急用支付宝进行转账,请你帮他尽可能找回密码。他只记得自己密码的一些零星信息:

①密码是六位数字,前面两位为59;

②最后两位数字相同;

③能被12和38整除。

程序界面如1图所示,单击 “帮助找回密码”按钮(Command1)后,可能的密码显示在列表框List1中。

  1. (1) 应用程序界面设计时,添加“list1”对象用于显示可能的密码,应使用2图所示的“控件工具箱”中的(填写相应编号)
  2. (2) 解决此问题的相应程序如下,请根据题意将程序补充完整。

    Private Sub  Command1_click ( )                    

    Dim x As Integer, s As Long, y As Integer, i As Integer

    For i = 0 To 9999

        S = 590000 + i

        If   Then

            x= s mod 10

            y = (s Mod 100) \ 10

            If x = y Then

                

            End If

        End If

    Next i

    End Sub

下列问题中适合使用枚举算法解决的是(   )
A . 在一串不相同的钥匙中寻找微格教室的前门钥匙 B . 计算五个同学的信息技术平均分 C . 找出笔筒中红色的签字笔 D . 超市的促销方案
对称字符串的特征是从左到右读和从右到左读是完全一样的。如“abba”是对称的,“abcba”也是对称的。判断字符串是否对称的VB程序段如下,请完善以下两处代码

s=Text1.Text

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

k=0:j=n

For i=1 to n/2

c1=Mid(s,i,1)

 c2=Mid(s,j,1)

If c1 <> c2 Then k = k+1: Exit For

j=

Next i

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

古希腊著名哲学家毕达哥拉斯把1,3,6,10,15,21,28……称为三角形数。这些三角形数序列有一定的规律,后一个数与前一个数的差刚好构成一个等差数列2,3,4,5,6,7……,所以第2位的“3”等于序列的第1位数“1”加上等差数“2”,第3位的6等于序列的第2位数“3”加上等差数“3”,……,第n位数m等于序列的第n-1位数加上等差数n。小金利用这个规律编写出了一个判断三角形数的VB程序,在文本框Text1中输入一个大于1的正整数,单击”判断”按钮Command1,在标签label1中显示判断结果。程序设计界面如图所示。
  1. (1) 在设计程序界面时,要清空标签中显示的内容“Label1”,应修改该标签的属性。
  2. (2) VB程序代码如下,请在画线处填入合适代码。

    Private Sub Command1_Click()

      Dim n As Integer,S As Integer

      s=0

      n=Val(Text1.Text)

      If n>1 Then

          For i=1 To n

              s=    ①     

              If n=s Then

                  Label1.Caption=Str(n)+”是一个三角形数。”

                  Exit For

                     ②   

                   Label1.Caption=Str(n)+”不是一个三角形数。”

                    Exit For

                      End If

                   Next i

    Else

                   Label1.Caption=”请输入一个大于1的正整数”

    End If

    End Sub

     ② 

  3. (3) 若文本框Text1中输入的内容为“27”,单击按钮Command1后,标签Label1中显示的内容是
编写VB程序,实现如下功能:有一个四位数,此数十位上的数字是7,且这个四位数是一个完全平方数,现要找出符合以上要求的所有四位数,并统计共有几个数。单击Command1按钮,将符合要求的四位数显示在列表框List1中,统计个数显示在标签Label2中,界面如图所示。

  1. (1) 若要修改窗体背景颜色,可在其属性窗口中属性的属性值进行修改。
  2. (2) 解决这个问题采用的算法是(填字母:A 、解析算法  B 、枚举算法)
  3. (3) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

    Private Sub Command1_Click()

      Dim i As Integer, x As Integer, c As Integer

      c = 0

      For i = 1000 To 9999

          x =

         If And x = 7 Then

               '将符合条件的四位数显示在列表框中

    num = num + 1

         End If

      Next i

      Label2.Caption = "共有:"+ +"个"

    End Sub

在n个连续的方格内填字母A或B,但相邻两格都不能填B,求所有可能方案。可以用枚举算法解决,此题可以采用进制转换来解决。考虑到只包含了A与B两个字母,我们可以用二进制的0和1来代替。

程序部分代码如下:

Private Sub Command1_Click()

Dim n, m, s, i, j, count As Long

Dim flag As Boolean

Dim a(1 To 100) As Integer

n = Val(Text1.Text)

count = 0

  ①  

For i = 0 to s-1

 m = i

 For j = 1 To n

 a(j) = m Mod 2

 m = m \ 2

Next j

flag = True

For j = 1 To n - 1

 If  ②  Then flag = false: exit For

Next j

If flag = True Then  ③  

Next i

Label1.Caption =“可行方案共”+ Str(count) + “种”

End Sub

  1. (1) 将代码补充完整:① ② ③ 
  2. (2) 若Text1中输入5,则可行方案共种。
星期天,小杰来到动物园游玩,园内共有N个景点,每个景点都有一个标号,标号为1至N。现在只知道每个景点有一条路连接下一个景点。小杰想知道,根据这些道路信息,从其中一个景点出发,最后再回到出发景点,最多能游玩多少个景点。

例如,共有N=5个景点,每个景点连接的下一个景点分别是2,4,5,5,2。

景点号

1

2

3

4

5

下一景点号

2

4

5

5

2

则他可以从2号景点出发,最多可以游玩2号、4号、5号三个景点。

程序代码如下:

Private Sub Command1_Click()

Dim a(1 To 100) As Integer, d(1 To 100) As Integer  ′数组a存放下一景点号

Dim jd As String, m As String, c As Integer, i As Integer

Dim s As Integer, p As Integer, k As Integer, ans As Integer

jd = Text1.Text + “,”

s = 0: c = 0

For i = 1 To Len(jd)

  m = Mid(jd, i, 1)

  If m <> ”,” Then

    s = s * 10 + Val(m)

  Else

    c=c+1:a(c)=s:s=0      ′含义

  End If

Next i

ans = 0: k = 0

For i = 1 To c      ′枚举游览起点

  For k = 1 To c

    d(k) = 0

  Next k

  If d(i) = 0 Then

    p = i

    Do While p <= c

      If d(p) = 0 Then

        k=k+1:d(p)=k

      Else

        y=   ②          ′填空

      If y>ans Then ans=y

      k = 0

      Exit Do

      End If

              ′改错

    Loop

  End If

Next i

Text2.Text = Str(ans)

End Sub

  1. (1) 若要实现显示“景点连接情况:”的Text1在程序运行时默认为空,则需要将Text1的属性设置为空。
  2. (2) 若有7个景点,且每个景点的连接情况为:6,3,7,2,7,5,4,那么小杰最多可以游玩的景点数是
  3. (3) 程序代码中,有下划线的语句“a(c)=s”代表的含义是
  4. (4) 程序代码中,程序代码填空:y=
  5. (5) 程序代码中,加框处代码有错,请改正
小王到某城市,时间只有一天了,但小王很想到该城市的著名大景区游玩,该城市的著名大景区内共有N(超过 10) 个景点,标号为1至N,假设每个景点都有一个进出口。现在只知道每个景点有一条路连接下一个景点。小王想知道,根据这些道路信息,从其中一个景点出发, 最后再回到出发景点离开,最多能游玩多少个景点。

图片_x0020_100010

例如,共有N=5个景点,每个景点连接的下一个景点分别是 2,4,2,3,1。

景点号

1

2

3

4

5

下一景点号

2

4

2

3

1

则他可以从2号景点出发,最多可以游玩2号、3号、4号三个景点。程序代码如下:

Private Sub Command1_Click()

    Dim a(1 To 100) As Integer, d(1 To 100) As Integer    '数组 a 存放下一景点号

    Dim jd As String, m As String, c As Integer, i As Integer

    Dim s As Integer, p As Integer, k As Integer, ans As Integer

    jd=Text1.Text+","

    s=0 : c=0

    For i=1 To Len(jd)

        m=Mid(jd,i,1)

        If m<>"," Then

                   ①       

        Else

            c=c+1 : a(c)=s: s=0

        End If

    Next i

    For k=1 To 100 d(k)=0

    Next k

    ans=0: k=0

    For i=1 To c    '枚举起点

        If d(i)=0 Then p=i

            Do While p<=c

                If d(p)=0 Then

                    k=k+1 :d(p)=k

                Else

                           ②       

                    If y>ans Then ans=y k=0

                    Exit Do

                End If

                 图片_x0020_100011     '改错

            Loop

        End If

    Next i

    Text2.Text=Str(ans)

End Sub

  1. (1) 若有7个景点,且每个景点的连接情况为:6,3,5,2,7,5,4,那么小王最多可以游玩的景点数是
  2. (2) 在上面的程序代码中的下划线中填入代码

     ② 

  3. (3) 在上面的程序代码中,加框处代码有错,请改正。
下列问题中,适合使用枚举算法的是(    )
A . 计算两个电阻的并联值 B . 计算五位同学的平均身高 C . 查找100以内所有能被6整除的数 D . 计算超市的月利润
素数(prime number)又称质数,有无限个。在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为素数,如2,3,5,7,11……求1到100之间所有素数的Python程序如下,请在划线处填入合适的代码。

import math         #导人math库,以便使用里面的函数

list= [2,3]           #2,3预先加到素数列表中

for i in range(5,101,2):      #第一层循环,从5到100中的奇数

     for j in range(2, ):     #第二层循环,逐个判断是否有因数

          if     #如果出现整除说明有因数

               break    #跳出循环判断下一个

        else:    #如果第二层循环结束还没有跳出的话

            list.append(i)    #说明是素数,加到列表里

            n+=1

for i in range(0,n+2):     #输出

     print(list[i])

珠心算是在大脑中以算珠表象作为载体,运用珠算法则所进行的计算。某学校的珠心算老师采用一种快速考查珠心算加法能力的测验方法,他随机给出一个正整数集合,集合中的数各不相同,然后要求学生回答:其中共有多少个数恰好等于集合中另外两个(不同的)数之和,例如集合{1,2,3,4},一共有2个数等于集合中另外两个数之和,它们是3、4(4=3+1,3=2+1)。将上述算法编写成程序,其功能如下:程序运行时产生n个范围在[1,100]内的不同的随机整数存储在数组a中,并在列表框List1中显示,单击按钮Command1后,在标签Label1上输出结果,如图所示。

  1. (1) 集合{1,2,3,4,5,6}中一共有个数等于集合中另外两个数之和。
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适代码。

    Const n=12

    Dim a(1 To n) As Integer

    Dim flag(1 To 100) As Boolean

    Private Sub Form_Load()

        Dim i As Integer, t As Integer

        For i=1 To 100

            flag(i)=False

        Next i

        i=1

        Do While i <=n

            t=Int(Rnd * 100)+1

            If Not flag(t) Then

               

                List1.AddItem Str(t)

                flag(t)=True

                i=i+1

            End If

        Loop

    End Sub

    Private Sub Command1_Click()

        Dim i As Integer, j As Integer, ans As Integer

        ans=0

        For i=1 To n

            For j=i+1 To n

                If a(i)+a(j)<=100 Then

                    If Then

                        ans=ans+1

                        flag(a(i)+a(j))= False

                    End If

               

            Next j

        Next i

        Label1.Caption="共有"+Str(ans)+"个数!"

    End Sub

小明编写了一个寻找非常幸运数的程序。程序运行时,单击“求解”按钮,则在列表框中输出所有的六位数中的非常幸运数,在标签Label2中输出非常幸运数的个数。

所谓的非常幸运数是指符合下列条件的整数:

⑴该数的偶数位数字之和等于奇数位数字之和。

⑵该数的前一半的各位数字之和正好等于后一半的各位数字之和。

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

Private Sub Command1_Click()

    Dim a(1 To 6) As Integer, sum(1 To 4) As Integer

    Dim x As Long, i As Long, count As Long, k As Long

    For i=100000 To 999999

        x=i

        k=1

        Do While x > 0

            a(k)=

            x=x\10

            k=k+1

        Loop

        sum(1)=a(1) +a(2)+a(3)

        sum(2)=a(4)+a(5)+a(6)

       

        sum(4)=a(2)+a(4)+a(6)

        If sum(1)=sum(2) And sum(3)=sum(4)Then

            List1.AddItem Str(i)

           

        End If

    Next i

    Label2.Caption="共有个数:" + str(count)

End Sub

哥德巴赫1742年给欧拉的信中哥德巴赫提出了以下猜想:任一大于2的偶数都可写成两个质数之和。下列程序的功能即验证哥德巴赫猜想。程序运行时,在文本框Text1中输入一个大于2的偶数,单击“证明”按钮Command1后,在列表框List1中输出所有符合猜想的组合,在标签Label2中输出共有多少个组合。程序运行效果如下图所示。

为实现上述功能程序如下,但加框处的代码有误,请改正。

Private Sub Command1_Click()

    Dim n As Integer

    Dim i As Integer, c As Integer

    n = Val(Text1.Text)

    List1.Clear

    c = 0

    If n Mod 2 = 0 Then

        For        ①

            If    Then            ②

                List1.AddItem n & "=" & i & "+" & n - i

                c = c + 1

            End If

        Next i

        Label2.Caption = "共有" & c & "种组合"

    Else

        Label2.Caption = "请输入一个大于 2 的偶数"

    End If

End Sub

Function is Prime(x As Integer) As Boolean

    Dim i As Integer

    Is Prime = True

    For i = 2 To Int(Sqr(x))

        If x Mod i = 0 Then

            Is Prime = False

            Exit For

        End If

    Next i

End Function

 ② 

有如下所示VB程序段:

str1 = “ABCDEFGHIJKLMNOPQRSTUVWXYZ”

s = “”

For i = 1 To 4

    t = Int(Rnd*10) + 1

    If t Mod 2 = i Mod 2 Then

        t = t + 1

    Else

        t = t + 2

    End If

    s = s + Mid(str1,t,1)

Next i

List1.AddItem s

执行该程序段后,列表框List1中可能显示的内容是(   )

A . BADC B . BCDY C . DEFG D . CDEF
向文本框Text1中输入一串包含大小写的字母,统计出现次数最多的字母(不区分大小写)并将该字母以大写方式输出到文本框Text2,如有多个字母次数相同的,则只记录最后出现的字母,部分程序如下:

Dim c(1 To 26)As Integer

s=Text1.Text

For i=1 To Len(s)

    x=Mid(s, i, 1)

    If x>="a" Then

        t=Asc(x)-Asc("a")+1

    Else

        t=Asc(x)-Asc("A")+1

    End If

       ① 

    If c(t)>=Max Then Max=c(t):   ②  

Next i

Text 2.Text=Chr(f+Asc("A"))

划线处应该填入的正确语句是(   )

A . ①c(t-1)=c(t-1)+1②f=t B . ①c(t)=c(t)+1②f=t C . ①c(t-1)=c(t-1)+1②f=t-1 D . ①c(t)=c(t)+1②f=t-1
现有n根棍子,第i根棍子的长度为a<sub>1</sub>,现设计了以下VB程序段,想要从中选出三根棍子组成周长尽可能长的三角形,输出最大的周长;若无法组成三角形,则输出0。如当n=5,a={2,3,4,5,10}时,输出12,即选择了3、4、5。当n=4,a={4,5,10,20}时,无法组成三角形,输出0。实现上述功能的VB程序代码如下,但加框处代码有误,请改正。

Dim a(1 To 1000) As Integer

Dim n As Integer

Private Sub Form_Load()

'确定n的值和数组a的各个元素值,即每根棍子的长度值,代码略

End Sub

Function max (x As Integer, y As Integer) As Integer

    If x>y Then

        max=x

    Else

        max=y

    End If

End Function

Private Sub Command1_Click()

    Dim i As Integer, J As Integer, K As Integer

    Dim ans As Integer, c As Integer, longest As Integer,

    rest As Integer

    ans=0

    '让i<j<k,保证棍子不会被重复选中

    For i=1 To n

        For j=i+1 To n

            For k=j+1 To n

                c=a(i)+a(j)+a(k)

                longest=      '①

                rest=c-longest        'rest 保存最短的两条边的和

                If Then      '②

                    ans=max(ans, c)

                End If

            Next k

        Next j

    Next i

    Print ans

End Sub

  1. (1) ①处应改为
  2. (2) ②处应改为
编写“寻找质因子”的程序,程序功能:在文本框Text1中输入[2,32767]之间的任意整数,单击“执行”按扭Command1后,在文本框Text2中显示该整数可分解出的所有质因子(若存在重复,只输出一次)。程序运行时界面如下图所示:

  1. (1) 观察程序界面,不具有Caption属性的对象有(填数字)个。
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

    Private Sub Command1_ Click()

        Dim n As Integer, m As Integer

        Dim s As String

        Dim bj As Boolean     '用于标记该质因子是否已存在

    n=Va1(Text1. Text)

        s=" "

        m= 2

        bj= True

        Do While n> 1

            If n Mod m=0 Then

                n=

                If bj= True Then

                    s=s+Str( m)

                    bj= False

                End If

            Else

                m=m+1

               

            End If

        Loop

        Text2. Text= s

    End Sub

  3. (3) 运行,上述程序,若在文本框Text1中输入1024,单击“执行”按钮后,文本框Text2中显示的内容为 。
小李忘记了自己的银行账号密码,非常着急,请帮她尽快找出密码。幸亏她还隐约记得自己的密码信息:①密码是六位数字,前面两位为31;②最后两位数字相同;③能被16和46整除。程序界面如图所示,单击“帮助找回密码”按钮Command1后,可能的密码显示在列表框List1中,实现上述功能的VB代码如下。

请回答下列问题:

  1. (1) 解决此问题的算法是(选填:枚举算法/解析算法)。
  2. (2) 在程序中划线处填入适当的代码。

    Private Sub Command1_ Click()

        Dim s As Long

        Dim iAs Integer,a As Integer,b As Integer

        For i=0 To 9999 Step

            s=310000+i

            If s Mod 46=0 Then

                a=

                b=s\ 10 Mod 10

                If a=b Then List1. AddItem Str(s)

            End If

        Next i

    End Sub

[矩阵上的枚举]大家有接触过地雷游戏吗?如图所示是一个“挖地雷”游戏的界面,9X9个格子里都有一个数字,红旗代表地雷可以用“★”表示,图中共有10个地雷,“一一”表示空白格,边上的“▲”表示边框。

定义规则:你需要标记出所有空白格子周边相邻的格子上有多少地雷(在正方向和斜45度方向挨着的格子均可视为相邻),并将数量标记在空白格中,如下图所示。

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

Dim n As Integer,m As Integer      'n 存储地雷区域大小,m存储地雷数目

Dim a(1 To 100 * 100) As String

Dim b(1 To 100 * 100) As Integer

Private Sub Command1_Click()       '按要求生成数组a中的数据并显示

    Randomize

    List1. Clear

    n=9 : m=10

    Dim s As String, pos As Integer, i As Integer

    s=" " : n=n+2

    For i=1 To n * n

        If isinside(i) Then a(i)="— —"

        Else a(i)="▲"

    Next i

    For i=1 To m

        pos=Int(Rnd * n * n)+1

        Do While a(pos)="★" Or

            pos= Int(Rnd * n *n)+1

        Loop

            a(pos)="★"

    Next i

    For i=1 To n* n

        s= s+" "+a(i)

        If i Mod n=0 Then

            List1. AddItem s

            s=" "

        End If

    Next i

End Sub

Private Sub Command2_Click()

    Dim i As Integer, j As Integer, row As Integer

    Dim col As Integer, start As Integer, temp As String

    For i=1 To n* n

        If a(i)="★" Then

        row=(i-1) \ n+1 : col=(i-1) Mod n+1

            For j=1 To 3

                start=

                If a(start+col- 1)="— —" Then b

                (start+ col- 1)= b(start+col- 1)+1

               If a(start+col)="— —" Then

                    b(start+ col)= b(start+col)+1

                If a(start+col+1)= "— —" Then b

                (start+col+ 1)= b(start+ col+1)+1

            Next j

        End If

    Next i

    List2. Clear

    For i=1 To n

        temp=" "

        For j=1 To n

            If a((i-1) * n+j)="— —" Then

                temp=temp+" "+ Str(b((i-1) * n+j))

            Else

                temp= temp+" "+a((i- 1)*n+j)

            End If

        Next j

        List2. AddItem temp

    Next i

End Sub

Function isinside(x As Integer) As Boolean

    isinside= x>n And And x

    Modn<;>1AndxMod<> 0

End Function

下列问题适合用枚举法求解的是(    )
A . 一元二次方程求解 B . 一个篮球从10米处做自由落体运动,求落地时的速度 C . 求一个圆柱体的表面积和体积 D . 求解百钱买百鸡问题