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

小丁想买几张6+1彩票,选号时,他希望前4位用自己的生日:11月8日,即1108,特别号码他选了买彩票日子的个位数5,并且他希望前六个数字组成的数能被他的幸运数字9整除。他的好朋友小杰帮他设计了一个VB程序,可以提供一份符合这些要求的号码清单供他挑选。相应的界面如图1所示。阅读程序并完成后面的问题。

图1

 

  1. (1) 设计应用程序界面时,为添加a所指向的对象,应使用2图所示的“控件工具箱”中的 (填写相应编号);在图3所示的“属性窗口”中,将 属性值设置为“开始”,可使图2中b所指向的对象显示“开始”。
  2. (2) 请根据题意将下列程序补充完整。

    Private Sub Command1_Click()

    Dim i as integer, j as integer, c As Integer

    Dim n As Long

    c = 0

    For i = 0 To 99

          n = 110800 + i

                  If        ①         Then

              List1.AddItem Str(n) + " " + "5"

                    ②     

         End If

    Next i

    Label2.Caption = "满足条件的数有:" + Str(c) + "组"

    End Sub
         ②

以下VB程序段的功能是用DO语句求1~1000之间满足“用3除余2,用5除余3,用7除余2”的数。并将结果在list1中列出,并在label1处显示符合条件的数的个数。

Private Sub Command1Click()

Dim i As Integer

Dim j As Integer

i = 1: j = 0

list1.clear

Do While i <= 1000

If (i Mod 3 = 2 And i Mod 5 = 3 And i Mod 7 = 2) Then

List1.AddItem i

    ①    

j = j + 1

End If

i = i + 1

Loop

Label1.Caption = Str(j)

End Sub

  1. (1) 程序中①处应填入的代码是
  2. (2) 程序运行结束后,变量i的值为
在我国古代《孙子算经》中曾经提出这样一个问题,原文是这样的:“今有物,不知其数,三三数之,剩二;五五数之,剩三;七七数之,剩二;问物几何?”试用枚举算法来解决这一个问题。现分析如下,所寻找之数为满足如下条件的自然数:以3除余2,以5除余3,以7除余2。程序将从自然数1开始依次寻找,逐一判断某一自然数是否满足全部条件,直至在指定范围内找到满足条件的所有自然数。程序代码如下,请补充完整。

 
Private Sub Command1_Click()

Dim sum As Integer    'sum 用来统计符合条件的自然数个数'

Dim n, max As Integer

List1.Clear

sum = 0

max = '指定查找范围的最大自然数,Text1文本框中输入'

n = 0

Do While n <= max

  n = n + 1            '从自然数1开始不断往上寻找'

  If Then

  List1.AddItem Str(n) '找到后在List1中显示结果'

 

  End If

Loop

List1.AddItem ("共计" + Str(sum) + "个")

End Sub

王敏的E-Mail邮箱密码忘记了,但她需要收一封很重要的来信,请你帮她尽可能找出密码。她零星记得自己密码信息:

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

②最后两位数字相同;

③能被16和46整除。

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

 

解决此问题的相应程序如下:

Private Sub Command1_Click()

Dim  a  As  Integer, s  As  long, b  As Integer, i  As  Integer

For  i = 0  To      ①      

    s = 310000 + i

    If  s  Mod  46 = 0   And  s  Mod  16 = 0   Then

              ②      

        b = (s  Mod  100) \ 10

        If a = b Then

            List1.AddItem Str(s)

        End If

    End If

Next i

End Sub

  1. (1) 解决此问题的算法是。(选填:枚举算法 或 解析算法)
  2. (2) 程序中①划线处应填入
  3. (3) 程序中②划线处应填入
小张编写 VB 程序,实现如下功能:在前 100 个偶自然数中,计算恰好有四位为 1 的二进制数的个数, 如图所示,单击“计算”按钮 Command1,在文本框 Text1 中显示符合条件的个数,在列表框 List1 中显示符合条件的二进制数。VB 程序代码如下:

提示:本题“除 2 取余倒排法”的方法将十进制转化为二进制,算法如下: 例如十进制数“97”转化为二进制的过程如右图所示:

因此“97”二进制值为:1100001

  1. (1) 解决此问题主要采用的算法是      (选填字母)
    A . 解析算法 B . 枚举算法
  2. (2) 为了实现程序的功能,请在划线处填入合适的代码。Private Sub Command1_Click()

      Dim a As Integer, c As Integer, w As Integer, i As Integer

      Dim s As String, k As String

      c = 0

      For m = 1 To 100

        k = ""

        i = 2 * m

        Do While i > 0

           a=i Mod 2 

      

           k = str(a) + k

        Loop

     

    For n = 1 To Len(k)

           s = Mid(k, n, 1)

           If s = "1" Then w = w + 1

        Next n

    If w = 4 Then

       c = c + 1

     End if

     Next m

     Text1.Text = Str(c) End Sub

质数又称为素数,除了1和它本身以外不再有其他因数的数成为素数。找到100到999以内的素数,并依次在列表框List1上输出的VB程序段如下:

For i = 100 To 999 lag = True: j = 2

Do While j < i And flag

   

Loop

If flag Then List1.AddItem Str(i) Next i

方框中的代码由以下四部分组成:①End If   ②If i Mod j = 0 Then   ③j = j + 1

④flag = False。代码顺序正确的是(  )

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

For i = 1 To 20

  a(i) = 0

Next i

For i = 1 To 20

If i Mod 3 = 0 Then a(i) = 1-a(i)

Next i

For i = 1 To 20

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

Next i

执行该程序段后,变量n的值为(  )

A . 6 B . 13 C . 14 D . 15
下列问题中,适合使用枚举算法解决的是(  )
A . 计算两个电阻的并联值 B . 计算五个同学的平均身高 C . 查找100以内所有能被6整除的数 D . 超市的促销方案
算法设计与程序实现勾股数求出100以内满足a<b的所有勾股数。

Dim a As Integer

Dim b As Integer

Dim c As Integer

For a=1 To 100

 For b=1 To 100

  For c=1 To 100

   If            Then

     Print a; b; c

   End If

  Next c

 Next b

Next a

  1. (1) 本题采用的算法是(填写:解析法/ 枚举法/排序法/递归法)。
  2. (2) 程序代码中空白处应填写的条件是          
    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
《孙子算经》中有一个“物不知其数”的问题,某数以3除余2,以5除余3,以7 除余 2。下面的 VB 程序用于求 1000 以内满足该条件的自然数及个数,请在程序划线处应填入合适的表达式。

Private Sub Command1_Click()

    Dim c As Integer, n As Integer c = 0 : n = 9

    Do While n <= 1000

        If n Mod 3 = 2 And n Mod 5 = 3 Then

            List1.AddItem Str(n)

            c =

        End If

        n =

    Loop

    Label1.Caption = "1000 以内满足条件的数有" & Str(c)& "个"

End Sub

下列VB程序的功能是:求得1000以内的所有水仙花数,并在list1中显示。水仙花数是指一个n位数(n)=3),它的每个位上的数字的n次幂之和等于它本身(例如:1^3+5^3+3^3=153)

Private Sub Command1_Click()

    List1.clear

    Dim a As Integer

    For i = 1 To 1000

        s = 0

        i= Len(Str(i)) - 1

        For j = 0 To i - 1

            a =           

            s = s + a ^ 3

        Next j

        If i = s Then

            List1.AddItem i

        End If

    Next i

End Sub

横线处应填写 (   )

A . i / 10 ^ j Mod 10 B . i \ 10 ^ j Mod 10 C . i \ 10 ^ (j Mod 10) D . (i \ 10) ^ j Mod 10
(加试题)小李同学碰到了一个数学问题:400个同学按顺序进行编号后围成一个大圈,按1至2报数(从1号位置开始),报到2的同学出列,以此一直循环报数下去,问最后剩下的那位同学他的编号是几号?

例如以6个同学编号为例,按1至2报数(从1号位置开始)依次出列的编号次序为2-4-6-3-1-5,那么最后剩下的就是编号为5的同学。

为了解决这个问题,小李用VB编写了如下程序尝试解决,其中列表list1显示出列的顺序编号,文本框text1中显示最后留下的编号,程序代码如下(测试界面如下图):

Private Sub Command1_Click()

    Dim s, f, t As Integer

    Dim a(1 To 400) As Boolean

    For i = 1 To 400

        a(i) = False

    Next i

    s = 0

    f = 0

    i = 0

    Do While f < 399

        i = i + 1

        If i = 401 Then i =

        If a(i) = False Then s = s + 1

        If s = 2 Then

             

            List1.AddItem Str(i)

            a(i) = True

            f =  

        End If

    Loop

    For i = 1 To 400

        If   Then text1.text=str(i)

    Next i

End Sub

在程序划线处填入合适的代码。

如果两个质数的差为2,则这两个质数称为孪生质数对;编写VB程序,实现如下功能:单击“显示孪生质数对”按钮Command1,在列表框List1中显示100以内的所有孪生质数对(运行效果如图所示)。

实现上述功能的VB代码如下。

Dim a(1 To 50) As Integer

Private sub Command1_Click()

    Dim i As Integer

    k=0: i=3

    Do While i<= 100

        If Not prime(i) Then

            k=k+1

           

        End If

        i=i+2

    Loop

    For i=2 To k

        If         Then

            List1 AddItem Str(a(i-1))+"和"+ Str(a(i))

        End if

    Next i

End Sub

Function prime (x As Integer)As Boolean

    prime=False

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

        If x Mod i=0 Then

            prime=True

            Exit for

        End If

    Next i

End Function

  1. (1) 语句“List1. AddItem Str(a(i-1))+"和"+Str(a(i))”中的AddItem是(单选,填字母:A .对象名/B .属性名/C .事件名/D .方法名)。
  2. (2) 程序代码中,加框处有错,请改正。
  3. (3) 程序代码中,将横线处语句补充完整。
  4. (4) 在自定义函数中,函数返回值prime=Flase表示的含义是
下列问题中适合使用枚举算法解决的是(    )
A . 在一串不相同的钥匙中寻找云教室的钥匙 B . 已知a,b,c,求一元二次方程ax2+bx+c=0的解 C . 超市的促销方案 D . 利用“割圆术”求圆周率的近似值
枚举算法的适用范围是(    )
A . 一切问题 B . 所求问题的解无限多 C . 所求问题解的个数有限且有明确的条件 D . 所求问题解的个数有限且无明确的条件
枚举算法思想在生活中解决问题的适用情况及特点有(   )
A . 运算量大 B . 求解数量有限 C . 所有的可能情况都符合一定的规则 D . 计算表达式来实现问题的解
将正整数n分解为两个正整数之和,其中一个能被3整除,另一个能被7整除。统计分解方法共有几种的VB程序段如下:

cnt = 0:i = 7

Do While i < n

   

Loop

Text1. Text = Str(cnt)

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

①i = i + 7   ②j = n - i   ③If j Mod 3 = 0 Then cnt = cnt + 1

下列选项中,代码顺序正确的是(    )

A . ①③② B . ②③① C . ③②① D . ①②③
将以下程序段补充完整。

问题:输入一个正整数n,判断n是否为素数。要判断n是否为素数,最简单的方法是:统计2到n-1之间能整除n的整数个数s,若s大于0,则n不是素数,否则就是素数。根据以上方法,完善以下程序代码。

Dim n, s As Integer

n = Val(InputBox(“n=”))

s=0

For i=2 to

    If n Mod i = 0 then

        s=        ‘统计因数个数

    End If

Next i

IfThen

    Print n &“是素数”

Else

Print n &“不是素数”

End If

在一千多年前的《孙子算经》中,有这样一道算术题:“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?”。即一个数除以3余2,除以5余3,除以7余2,求这个数。

i=

while (i%3!=2  i%5!=3 or i%7!=2):

    i=

print(i)

星期天小明来到动物园游玩,园内共有n 个景点,每个景点序号为0,1,2,3……至n-1。现在只知道每个景点有一条路连接下一个景点。小明想寻找能游玩景点个数最多的一种方案并且从其中一个景点出发,最后能够回到出发景点。如果游玩的景点个数一样,则优先考虑景点序号小的。

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

景点号

0

1

2

3

4

下一个景点号

1

3

4

4

1

方案一:从0号景点出发,则游玩线路为:0号→1号→3号→4号→1号,由于此方案无法回到出发点,则不考虑;

方案二:从1号景点出发,则游玩线路为:1号→3号→4号→1号,然后回到1号景点。最多可以玩3个景点。

现用Python程序模拟这个问题:

先输入景点总数:n ;则对应的景点为[0,1,2,3,4]

然后随机产生各景点所连接的下一个景点的序号,如:[1,3,4,4,1];

接着产生一个列表,如上表的信息则产生的列表s为:[[0,1],[1,3],[2,4],[3,4],[4,1]],

最后利用链表的方式来分析解决问题。

程序如下:

import random

#产生信息列表s

n=int(input("景点总数 "))

tt=[ ]; s=[ ]; c=0

while c < n :

  t=random.randint(0,n-1)

  if t !=c :

    s.append([   ①   ])

    c+=1

print(s)

#枚举所有方案,寻找正确方案。

max=0

for head in range(n):

  p=head

  k=1

  while k<=n and s[p][1]!=head:

    k+=1

    p=s[p][1]

  if  :

    max = k

    maxp = head

print("小明最多能访问 %d 个景点"%(max))

#输出正确线路

p=maxp

while s[p][1]!=maxp:

  print(s[p][0],end="→")

  p=s[p][1]

print(   ②    )

  1. (1) 横线处填写合适代码

     ② 

  2. (2) 方框处修改代码