3.3 简单算法及其程序实现 知识点题库

个位数字是6,且能被3整除的3位数共有多少个?下面程序用于解决这一问题,在划线处填入合适的语句或表达式,设共有n个这样的数,Visual Basic程序如下:

Sub Command1_Click()

Dim i As Integer, n As Integer

m=106

n =

Do While m <= 996

    If Then n = n + 1

    m=

Loop

Text1.Text = Str(n)

End Sub

“字符洗牌”程序模拟扑克洗牌的操作,为了打乱牌序,把手上的扑克牌中间抽一部分放到最上面,完成一次洗牌(如字符串“1234ABCD”,若把中间的第3个到第5字母抽出并保持原来的顺序放到最前面,则一次洗牌操作后字符串变成“34A12BCD”),也可以把扑克牌分成上下两部分,把下面的部分放置到上面(如字符串“1234ABCD”,把第3个字符到最后一个字符移到前面,变成“34ABCD12”),多次重复做这个动作,就能达到洗牌的目的,效果如图所示。

  1. (1) 若要把窗体的标题名称由“Form1” 改为“字符洗牌”,应改变窗体的属性。
  2. (2) 完成上述功能的程序代码如下,请在划线处填入合适的代码

    Private Sub Command1_Click()

        Dim r As Integer, k1 As Integer, k2 As Integer, r As Integer

        Dim s As String, n As Integer

                           '从文本框TxtIn中获取字符串

        Randomize

        r = Int(Rnd() * 10) + 1   '随机生成洗牌次数

        n = Len(s)

        Do While r >= 1        '洗牌操作

            k1 = Int(Rnd() * (n - 2)) + 2

            k2 = Int(Rnd() * (n - k1 + 1)) + k1

            s =   + Mid(s, 1, k1 - 1) + Mid(s, k2 + 1, n - k2)  

            r = r - 1

        Loop

            '输出结果

    End Sub

  3. (3) 若加框处的语句改为TxtOut.Text = Str(s),则运行程序时会发生的错误消息为_________
    A . B . C . D .
计算梯形面积的算法描述如下:

①输入上底a、下底b和高h

②计算梯形面积s(计算公式为:s=(a+b)*h/2)

③输出结果

④结束

上述算法属于(  )

A . 解析算法 B . 排序算法 C . 递归算法 D . 枚举算法
现有n根棍子,第i根棍子的长度为ai 。想要从中选出三根棍子组成周长尽可能长的三角形,输出最大的周长;若无法组成三角形,则输出0。如当n=5,a={2,3,4,5,10}时,输出12,即选择了3、4、5。当n=4,a={4,5,10,20}时,无法组成三角形,输出0。加框处代码有误,请改正。

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

 ② 

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

图1

输入火柴棍的数量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”的方案数,程序界面如图2所示。

图2

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

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

    Private Sub Command1_Click()

    Dim a(0 To 2222) As Integer '存储每个整数需用的火柴棍数

    Dim n As Integer, ans As Integer

    Dim i As Integer, j As Integer

    n = Val(Text1.Text)

    For i = 0 To 2222

    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 2222 '计算出10~n 中每个数字需用的火柴棍数

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

    Next i

    ans = 0

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

    For i = 0 To 1111

    For j = 0 To 1111

    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 时,方案数为 。
火柴游戏:有n根火柴,第1次取1根,第2次取2根,第i次取i根,当剩余火柴数为0时,不用添加火柴(即k=0),游戏结束。如果剩余火柴数不为0,但不够下一次取,此时添加k(k≥1)根火柴,在剩余火柴中再从1根开始取,直到能取完为止,求k的最小值。

例如:n=3时,第1次取1根,第2次取2根,此时正好取完,无须添加火柴,k=0;

例如:n=8时,第1次取1根,第2次取2根,第3次取3根,第4次要取4根,但剩余2根不够取。则加上1根,剩余3根,再从1根开始取,即第4次取1根,第5次取2根,剩余火柴为0,游戏结束,得k=1。

又如:n=4时,第1次取1根,第2次取2根,第3次不够取,若加上1根,剩余2根,再从1根开始取,第3次取1根,剩余1根不够第4次取,再加1根,又是剩余2根,显然加1根永远不可能取完。所以改用每次加2根,第1次取1根,第2次取2根,第3次不够取,添加2根,第3次取1根,第4次取2根,恰好能取完,得k=2。

编写一个VB程序可实现上述功能:在文本框Text1中输入火柴数量,单击“计算”按钮,在文本框Text2中显示最少添加数量,程序运行界面如下图所示:

实现上述功能的程序代码如下:

Private Sub ok_Click()

Dim a(1 To 100) As Boolean, n As Integer, k As Integer, i As Integer

n = Val(Text1.Text)

For i = 1 To 100

    a(i) = False

Next i

a(n) = True

Do While n <> 0

    i = 1

    Do While i <= n

             ①      

        i = i + 1

    Loop

    If n = 0 Then

        Text2.Text = Str(k)

    Else

        If k = 0 Then k = 1

        n = n + k

        If       ②      Then

            k = k + 1

            n = Val(Text1.Text)

        Else

            a(n) = True

        End If

    End If

Loop

End Sub

  1. (1) 由代码可知,“计算”按钮的对象名是
  2. (2) 程序加框处代码有错,请改正。
  3. (3) 请在划线处填入合适的代码。

     ② 

算法设计与程序实现

换钱问题:

要将一张100元的钞票,换成等值的5元、2元、1元一张的钞票共50张。其中一种换法如下:

5元:3张

2元:38张

1元:9张

求出所有的换钱方案。

【算法设计】

x表示5元的张数:1≦x≦20;

y表示2元的张数:1≦y≦50;

z表示1元的张数:1≦z≦100。

【参考程序】

Dim x AsInteger

Dim y AsInteger

Dim z As Integer

For x=1 To20

    For y=1To 50

        Forz=1 To 100

           If           Then

               Print x;y;z       ‘x y z 之间以分号分隔

           End If

        Nextz

   Next y

Next x

根据上述回答下列问题:

  1. (1) 本题采用的算法是 (填:解析法/枚举法/排序法/递归法)。
  2. (2) 程序代码中空白处应填写的条件是           
    A . 5x + 2y + z=100 Or  x+ y + z = 50 B . 5x + 2y + z=100 And x + y + z = 50 C . 5*x + 2*y + z=100 Or x + y + z = 50 D . 5*x + 2*y + z=100 And x + y + z = 50
已知海伦公式: , p=(a+b+c)/2,a、b、c分别为三角形的边长,利用海伦公式求三角形面积的算法属于(     )
A . 解析法 B . 查找法 C . 排序法 D . 穷举法
一个正整数x,如果它的平方数的最后几位数字和这个数相等,则该数为同构数。例如:5的平方数是25,且5出现在25的右侧,那么5就是一个同构数。设计程序,输出1000-9999间的同构数x,并统计个数。
  1. (1) 本题适用的算法是和此算法的基本结构是(    )。
    A . 查找算法,循环中嵌套分支 B . 枚举算法,循环中嵌套分支 C . 查找算法,循环中嵌套循环 D . 枚举算法,循环中嵌套循环
  2. (2) 判断1000-9999范围内的整数x是同构数的条件是(     )。
    A . x=x mod 1000 B . x=x^2 mod 1000 C . x=x mod 10000 D . x=x^2 mod 10000
  3. (3) 编写程序,实现算法功能。
下列问题中,适合使用枚举算法的是(    )
A . 计算两个电阻的并联值 B . 计算五位同学的平均身高 C . 查找100以内所有能被6整除的数 D . 计算超市的月利润
密码的合法性。某网络服务平台,要求新注册用户的密码必须以字母开头,并且含有字母(区分大小写)、数字和下划线,密码字符的长度为6~18个字符。判断用户的密码是否合法的某Python程序如下,请在程序划线处填入合适的代码,完善程序。

n1 =False #判断数字

n2=False #判断下划线

flag=False #判断首字符和长度是否满足要求

password=input('请输入密码:\n')

n=     ①      

ch=password[0]

if 19>n>5 and (z'>=ch>='a' or 'Z>= =ch>='A'):

    flag=True

if flag:

    for i in range(1, n):

        ch=password[i]

        if '9'>=ch>='0':

            n1=      ②     

      elif ch= '_':

          n2=True

if      ③      

    print('结果:', '合法')

else:

    print('结果:', '不合法')
  ②  ③

数学中的“自守数”:如果一个数的平方数的末几位等于该数本身,这个数就是自守数。例如:

5*5=25

6*6=36

25*25=625

76*76=5776

……

那么,5、6、25、76 等数被称为自守数。小袁编写一个 VB 程序,实现如下功能:找出 10000 以内所有可能的自守数,单击“统计”按钮 Command1,将符合要求的自守数显示在列表框 List1 中,统计个数显示在标签 Label1 中,运行界面如图所示。

  1. (1) 程序运行时要在按钮上显示“统计”,应设置该按钮的属性。
  2. (2) 为实现上述功能,请在划线处填入合适的代码。

    Private Sub Command1_Click()

        Dim n As Single, k As Integer, t As Integer, c As Integer

        List1.Clear c=0

        For n = 5 To 10000

            k = Len(Trim(n))               'Trim()函数用于删除字符串前后的空格

            t = (n * n) Mod     ①     

            If t = n Then

                List1.AddItem Str(n)

                  ② 

            End If

        Next n

        Label1.Caption = "自守个数为:" + Str(c)

    End Sub

    为实现上述功能,划线处应填入的代码分别为

  3. (3) 解决该问题采用了(选填:枚举/解析)算法。
小强在双十一购物期间忘记了支付宝账户密码,但他急用支付宝进行转账,请你帮他尽可能找回密码。他只记得自己密码的一些零星信息:

①密码是六位数字,前面两位为59;②最后两位数字相同;③能被12和38整除。

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

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

    Private Sub Command1_click( )

        Dim x As Integer, s As Long

        Dim y As Integer, i As Integer

        For i = 0 To 9999

            s = 590000 + i

            If Then

                x= s mod 10

                y =

                If x = y Then

                    List1.AddItem Str(s)

                End If

            End If

        Next i

    End Sub

  3. (3) 该模块采用的算法是(   )
    A . 枚举 B . 查找 C . 排序 D . 解析
小王编写了一个VB程序,该程序的功能是:15个数形成环状,现要分别找出3个相邻的数:使其相加之和最大或最小。如15个数依次为:18,14,42,61,13,19,14,13,28,52,61,58,30,则相邻三数之和最大为62(30+18+14),相邻三数之和最小为31(4+26+1)。

程序运行时,先随机生成15个[1,30]区间内的整数,存储在数组a(0)至a(14),并在文本框Text1中显示;单击“计算”按钮Command1,则在标签Labe14中显示连续三数最大和,在标签Label5中显示连续三数最小和,程序运行界面如图所示。

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

Const n=14

Dim a(n) As Integer

Private Sub Form_Load()

'随机生成15个数,存储在数组元素a(0)~a(14)中,并显示在文本框Text1中

End Sub

Private Sub Command1_Click()

    Dim i As Integer, j As Integer, k As Integer

    Dim imax As Integer, imin As Integer

    Dim smax As Integer, sum As Integer, smin As Integer

    smax=0:smin=100

    For i=0 To 14

        j=

        k=

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

        If sum>smax Then

            smax=sum

            imax=i

        End If

        If sum<smin Then

            smin=sum

            imin=i

        End If

    Next i

    Label4.Caption=Str(smax)

    Label5.Caption=Str(smin)

End Sub

向文本框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
枚举算法的适用范围是(    )
A . 一切问题 B . 所求问题的解无限多 C . 所求问题解的个数有限且有明确的条件 D . 所求问题解的个数有限且无明确的条件
下列问题中适合使用枚举算法解决的是(    )
A . 已知5个电阻阻值,求它们并联后的阻值 B . 银行贷款买房后每月还货金额的计算 C . 查找100以内所有能被6整除的数 D . 已知某同学的身高和体重,判断体重指数的等级
下列适合使用枚举算法解决的是(   )。
A . 判断2021年是否为闰年 B . 计算两个电阻的并联值 C . 计算本次数学考试班级平均分 D . 找出100以内所有的素数
某算法部分流程如图1所示,执行此部分流程后,下列说法正确的是(  )

A . 此流程使用枚举算法(枚举i的值),虚线框部分是分支结构 B . 流程中sum←sum+i与i←i+1调换下位置,输出的sum,c,i的值都不变 C . 最终i的值是401,i←i+1执行数是200次 D . 将流程图修改为如图2所示,程序运行结果会发生变化。
小李忘记了自己的银行账号密码,非常着急,请帮她尽快找出密码。幸亏她还隐约记得自己的密码信息:①密码是六位数字,前面两位为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

最近更新