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

大约1500年前,《孙子算经》中记载了"鸡兔同笼"问题.原文大意是:如果若干只鸡和兔在同一个笼子里,从上面数有35个头,从下面数有94只脚,求笼中鸡和兔子各有几只?
现在我们用VB6.0软件设计一个程序,可以解答上述问题,通过界面输入鸡和兔头数和,鸡、兔脚数和。在输入数据合理的情况下,求出鸡、兔各有多少只。程序运行界面图、输出界面图和程序的代码如下所示。
         
程序运行界面图                      输出结果界面图
程序代码如下:
Private  Sub Command1_Click(  )
Dim x As Integer, y As Integer   ’x是鸡的数量,y是兔的数量
Dim a As Integer, b As Integer   ’a是鸡兔的头数,b是鸡兔的脚数和
a = Val(Text1.Text)
b = Val(Text2.Text)
If b < 2 * a Or b > 4 * a Then   ’对数据合理性做出判断
MsgBox "您的输入数据不合理,请重新输入!", , "错误提示"
Text1.Text = ""
Text2.Text = ""
   ①          
x = 0
Do While x     ②    a
y = a - x
If (2 * x + 4 * y = b) Then
MsgBox "鸡有:" & x & "只   兔有:" & y & "只", , "运行结果"
End If
   ③    
Loop
End Sub
Private  Sub Command2_Click(  )
Text1.Text = ""
Text2.Text = ""
End Sub
请分析任务,完成下面试题。
  1. (1) 程序设计的“灵魂”是(选填“代码”或“算法”)。
  2. (2) 流程图用图框及流程线来表示算法。流程图中的“    ”(菱形框) 用来表示(选填“数据处理”或“选择分支”)。
  3. (3) 程序中的语句“Dim a As Integer”,是将变量a的数据类型定义为
  4. (4) 程序中的语句用到了Msgbox函数,此函数的作用是(选填“输入数据”,“输出数据”或“数据转换”
  5. (5) 程序中①所在的横线处应填写的语句是
  6. (6) 程序中②所在的横线处应填写的语句是
  7. (7) 程序中③所在的横线处应填写的语句是
  8. (8) 如题图一所示的程序运行界面,要改变窗体的标题,使其显示为“鸡兔同笼”应修改窗体控件的(选填“Caption”,“Name”,“Text”)属性。
  9. (9) 本程序中求解问题所用到的算法属于(选填“解析法”、“穷举法”或“递归法”)。
  10. (10) 本程序“鸡兔同笼”窗体中(如程序运行界面图)使用的控件类型有

                                    。

三个正整数a、b、c满足等式a2+b2=c2 , a、b、c称为“勾股数”,求出100以内所有“勾股数”可采用的算法是        (   )
A . 枚举算法 B . 解析算法 C . 冒泡排序 D . 顺序查找
要列出所有用数字1、2、3、0组成的没有重复数字的三位数,小赵利用软件编写了程序,界面如图,在 list1 中显示所有满足条件的三位数,在 label1 中显示满足条件的三位数的个数。

 

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

Private Sub Command1_Click() Dim a, b, c, d, z As Integer d = 0

For a = 1 To 3  'a代表百位

   For b = 0 To 3  'b代表十位

      For c = 0 To 3

        If a <> b And b <> c And c <> a Then                      ①                        list1.AddItem  str(z)            d = d + 1

        End If

      Next c

   Next b Next a

label1.Caption = "共有" +       ②          + "个数"

End Sub

  1. (1) 程序代码中Command1_Click()代表   (填写编号:1、属性名2、方法名3、事件名4、过程名)
  2. (2) 为实现上述功能,请填写正确的代码

    划线①处应填入的代码为 ;划线②处应填入的代码为  

如图1所示,这是一个城市街道简图,小明从 A 点出发,到达 B 点,如果在每一个路口只能向右或向上走(0 表示向上走,1 表示向右走),问小明有多少条行走路线,并请输出每条路线。程序界面如图2所示。

算法分析:从A点到B点共有7个路口,即可以有一个7位二进制数表示所走路线。观察以上路线,枚举所有满足路线特征的7位二进制数,再去掉不满足的二进制数即可。

  1. (1) 图1所示路线对应的十进制数为
  2. (2) 实现上述功能的 VB 程序如下,请在划线处填入合适的代码。

    Private Sub Command1_Click()

    Dim b As String, t As Integer, i As Integer, c As Integer, d As Integer

    t = 0 '可走路线计数

    For i = 15 To 120 '所有可走路线用十进制枚举

    d = i

    c = 0

    b = ""

    Do While d <> 0

    If d Mod 2 = 1 Then

        b = "1" + b

        c = c + 1

        If c > 4 Then Exit Do '若"1"的总数超过 4 个表示路线错误,需退出 Do 循环

    Else

          ① 

    End If

          ② 

    Loop

    If c = 4 And Len(b) = 7 Then

        t = t + 1

        List1.AddItem b

    End If

    Next i

    Label1.Caption = Str(t) + " 条"

    End Sub

     ② 

穷举法的适用范围是(   )
A . 一切问题 B . 所求问题的解无限多 C . 所求问题解的个数有限且有明确的条件 D . 所求问题解的个数有限且无明确的条件
某单位招考公务员,2010年和2011年分别有4 020名和2 000名考生报名,下列VB程序用于统计两次考试都参加的考生信息。程序界面设计如图所示,2010年和2011年的考生信息分别显示在List1和List2中,点击“统计”按钮,在List3中显示两次考试都参加的考生信息和总人数。

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

    Dim a (1 To 4020 ) As String

    Dim b (1 To 2000 ) As String

    Private Sub Form_Load( )

    Dim conn As New ADODB.Connection

    Dim rs As New ADODB.Recordset

    Dim constr As string

    constr=“Provider=Microsoft.ace.OLEDB.12.0;”

    constr=constr &“Data Source=” & App.Path+“\data\KaoSheng.accdb”

    conn.ConnectionString=constr

    conn.open()

    Dim sql As String

    ‘将参加2010年下半年考试的考生的身份证号码按升序存放在a数组中

    sql=“select * from kaoshengInfo where year=‘2010’order by sfzh asc”

    rs.Open sql,conn

    i=0

    Do While Not rs.EOF

     i=i+1

     a(i)=rs(“sfzh”)

     List1.additem(a(i))

     rs.MoveNext

    Loop

    ‘将参加2011年下半年考试的考生的身份证号码按升序存放在b数组中

    sql=“select * from kaoshengInfo where year=‘2011’order by sfzh asc”

    rs.Open sql,conn

    i=0

    Do While Not rs.EOF

     i=i+1

     b(i)=rs(“sfzh”)

     List2.additem(b(i))

     rs.MoveNext

    Loop

    rs.Close

    End Sub

    Private Sub Command1_Click ()

    Dim bot As Integer, top As Integer, m As Integer

    Dim i As Integer, ans As Integer

    ans=0

      For i=1 To 2000

        bot=1

        

       Do While  bot <=top

         m=Fix ( ( bot+top ) / 2 )

         If a ( m )=b ( i ) Then

          List3.AddItem  a ( m )

           

          Exit Do

         ElseIf  Then

          top=m-1

         Else

          bot=m+1

         End If

       Loop

     Next i

     List3.AddItem“总计”+str(ans)+“人次”

    End Sub

  2. (2) 分析上述代码,在数据库中用于存放考试信息的数据表名称是
平面上有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程序。在窗体加载时,从数据库中读取N的值和编号为1到N的房间的居住人数,人数存储在数组a中。点击窗体上的按钮Command1,程序枚举每一种方案(不同的初始房间),计算该方案的能量和,在文本框Text1中输出最优方案的初始房间编号,在文本框Text2中输出最小能量和。

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

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

Private Sub Form_Load()

‘本过程从数据库中读取N的值和每个房间居住人数,存储在数组a中

‘代码略

End Sub

Private Sub Command1_Click()

Dim i As Integer, j As Integer, w As Integer, k as Integer

Dim t As Long, ans As Long

k=0 : ans = 32767     ‘ans初始化为最大的Integer数据

For i = 1 To n

 t = 0

 For j = 0 To n - 1

    w=

    If w = 0 Then w = n

    t=

 Next j

 If t < ans Then

    k= i

    ans = t

 End If

Next i

Text1.Text = Str (k)    ‘起始房间编号

Text2.Text =

End Sub

设计算法,求同时满足以下条件的所有四位正整数之和s。

①不大于n(n的值是由键盘输入);

②能被9整除;

③十位数是2。

算法流程图如图所示:

  1. (1) 解决上述问题的算法属于(  )
    A . 枚举法 B . 擂台法 C . 解析法 D . 对分法
  2. (2) 判断x能被9整除的设计思路是(  );取x十位上数字的设计思路是(  )。
    A . x除以9的余数为0:先求x除以10的余数,再求该余数除以10的商 B . x除以9的商为0;先求x除以10的余数,再求该余数除以100的商 C . x除以9的商为0;先求x除以100的余数,再求该余数除以100的商 D . x除以9的余数为0;先求x除以100的余数,再求该余数除以10的商
  3. (3) 请完善划线处内容,完成上述功能。

    Dim n as Integer, x as Integer, s as long

    s=0

    n=InputBox(“输入四位数上限值”)

    For    ⑴   

        If   ⑵   and   ⑶   Then

          S=s+x

        End If

    Next

      ⑷ 

     ⑵ ⑶ ⑷ 

一辆卡车运矿石,晴天每天运20次,雨天每天最多运12次,他一共运了8天,共112次,则晴天和雨天各有几天。用VB程序来解决这个问题,单击按钮Command1,在文本框Text1中输出晴天的天数,在文本框Text2中输出雨天的天数,程序代码如下:

Private Sub Command1_Click()

    i=1

    j=7

    Do While _______

        i=_______

        j=________

    Loop

    Text1.Text=Str(i)

    Text2.Text=Str(j)

End Sub

则下列说法正确的是(   )

A . ①应填的代码为 i*20+j*12<>112 B . ②应填的代码为i-1 C . ③应填的代码为j+1 D . 描述该算法的思想为解析算法
小张的QQ密码忘记了,请你帮他找回密码。他只记得自己密码的一些零星信息:

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

②最后两位数字相同;

③能被12和38整除。

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

  1. (1) 应用程序界面设计时,为添加“可能的密码有:”对象,应使用左图所示的“控件工具箱”中的(填写相应编号),并在右图所示的“属性窗口”中,将属性值设置为“可能的密码有:”。
  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     ②    Then

                    List1.AddItem    ③  

                End If

            End If

        Next i

    End Sub

    ,②,③

    A.x=y    B.Str(s)   C.Str(i)    D.s Mod 12=0 and s Mod 38=0

用枚举算法求解“找出所有满足各位数字之和等于5的三位数”时,在下列所列举的数值范围内,算法执行效率最高的是(   )
A . 从0到999 B . 从100到999 C . 从100到500 D . 从104到500
一个十进制整数的二进制表示中,如果数字“1”的个数多于数字“0”的个数,则称该整数为A类数。如十进制整数26的二进制表示为11010,26是一个A类数。下列VB程序的功能是:统计前1000个自然数中A类数的个数,并在文本框中输出。请在划线处填入合适代码。

Private Sub Command1_Click()

    Dim i As Integer, n As Integer

    Dim s As Integer, t As Integer, k As Integer

    s = 0

    For i = 1 To 1000

        n = i

        t = 0

        k = 0

        Do While n > 0

            If n Mod 2 = 1 Then t = t + 1 Else k = k + 1

           

        Loop

        If Then s = s + 1

    Next i

    Text1.Text = Str(s)

End Sub

一个十进制整数的二进制表示中,如果数字“1”的个数多于数字“0”的个数,则称该整数为A类数。如十进制整数26的二进制表示为11010,26就是一个A类数。以下VB程序的功能:寻找前1000个自然数中所有A类数在List1中输出,并将统计个数在Text1中输出。请回答以下问题:
  1. (1) 十进制数37(选填:是/不是)A类数。
  2. (2) 请在划线处填入合适的代码。

    Private Sub Command1_Click()

        Dim i As Integer, n As Integer

        Dim s As Integer            's为A类数的个数

        Dim t As Integer            't为二进制数中“1”的个数

        Dim k As Integer           'k为二进制数中“0”的个数

        s=0

        For i=1 To 1000

            n=i: t=0: k=0

            Do While n>0

                If Then t=t+1 Else k=k+1

               

            Loop

            If t>k Then

                List1.Additem Str(i)

                s=s+1

            End If

        Next i

        Text1.Text=Str(s)

    End Sub

下列说法符合枚举算法的是(    )
A . 逐一判断,强调不遗漏且不重复地验证条件 B . 根据条件判断是否合适,保留合适的,舍弃不合适的 C . 为了提高解决问题的效率,使可能解的范围将至最小 D . 可作为某类问题时间性能的底线,用来引出同样问题的更高效率的算法
下列适合使用枚举算法解决的是(   )。
A . 判断2021年是否为闰年 B . 计算两个电阻的并联值 C . 计算本次数学考试班级平均分 D . 找出100以内所有的素数
一个弹球会发出红、绿或蓝三种单色光。 发着光的弹球从高处垂直下落,触地会垂直弹起,且弹起时发光颜色会变化。 假设弹球下落高度为 h, 触地前发红光、绿光、蓝光时,反弹高度分别为0.8h、0.6h、0.5h。 触地若干次后,弹球弹起时不再发光。观察弹球的发光颜色变化,并用字符串记录,其中每个字符表示弹球一次触地前的发光颜色(字符R、G、B 分别表示红、绿、蓝)。编写一个程序,计算弹球发光状态下的运动轨迹长度。
  1. (1) 请根据运行结果,完善下面的代码

    h=

    s=input('触地前的发光颜色变化:') 

    d={'R':0.8,'G':0.6,'B':0.5}

    sum=h

    for i in range(1,len(s)):

      

      h=d[c]*h

      sum=

    print('弹球发光状态下的运动轨迹长度:'+str(sum)) 

  2. (2) 请结合题目描述和程序代码判断这是哪种算法(单选,填字母:A .解析算法/B .枚举算法)
如果一个数恰好等于它的真因子(即除了自身以外的约数)的和,则称该数为“完全数”。如6=1+2+3。编写“统计1000以内的完全数的数量”程序,Python如下所示:

def f(x):#求真因子和

     s=0

     for i in range(1, x//2+1) :

        if     ①  

            s=s+i

        return S

c=0

for i in range(1, 1001) :

     if    ②    :

         c=c+1

print (c)

  1. (1) 本题采用的算法是(选填:解析算法/枚举算法)
  2. (2) 请在划线处填上合适的代码

     ② 

  3. (3) 28是完全数吗?(选填:是/不是)
, 其中n为正整数,计算s值的VB程序段如下:

s=1:i=1:t=1

Do While i<2*n-1

   

Loop

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

①s=s+t

②i=i+2

③t= -t/(i*(i- 1))

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

A . ③①② B . ①②③ C . ②①③ D . ②③①
利用枚举算法解决问题时,确定枚举范围可使用下列语句中的(    )。
A . elif B . if C . import D . while
水仙花数是指一个三位数,它的每个位上数字的3次方之和等于它本身,现要求出所有三位的水山花数,下列算法最合适的是(    )
A . 二分法 B . 解祈法 C . 迭代法 D . 枚举法
最近更新