一、选择题第9题:数的分解统计
【2021年1月原题】9.将正整数n分解为两个正整数之和,其中一个能被3整除,另一个能被7整除。统计分解方法共有几种的VB程序段如下:
【Python版】将正整数n分解为两个正整数之和,其中一个能被3整除,另一个能被7整除。统计分解方法共有几种的Python程序段如下:
cnt =0i =7n =int(input())# 输入正整数nwhile i < n:# 加框处print(cnt)
方框中代由以下三部分组成:
① i += 7 ② j = n - i ③ if j%3 == 0: cnt += 1
下列选项中,代码顺序正确的是 A. ①③② B. ②③① C. ③②① D. ①②③
【解析】程序逻辑:从i=7开始,每次递增7,计算j=n-i,判断j能否被3整除,满足则计数+1,对应顺序为②③①,选B。
二、选择题第10题:字符串匹配处理
【2021年1月原题】10.有如下VB程序段:
s1="BGR":s2="VBPROGRAM"i=1: j=1: s3=" "Do While i<=Len(s1)And j <= Len(s2)If Mid(sl,i,1)= Mid(s2,j,1)Theni = i +1Elses3=s3 + Mid(s2,j,1)End Ifj = j + 1Loop
执行该程序段后,变量s3的值是 A. "VPO" B. "VPRO" C. "VPOAM" D. "VPROAM"
【Python版】有如下Python程序段:
s1 ="BGR"s2 ="VBPROGRAM"i =0j =0s3 =""while i <len(s1) and j <len(s2):if s1[i] == s2[j]:i +=1else:s3 += s2[j]j +=1print(s3)
执行后,s3的值是 A. "VPO" B. "VPRO" C. "VPOAM" D. "VPROAM"
【解析】逐字符匹配s1与s2,匹配成功i递增,失败则将s2当前字符加入s3,最终s3为VPRO,选B。
三、选择题第11题:冒泡排序原序列判断
【2021年1月原题】采用冒泡排序算法对某数据序列进行排序,经过第一轮排序后的结果是“2,8,3,9,5,6,7”,那么原数据序列不可能的是 A. 8,3,9,5,2,7,6 B. 8,3,9,2,6,5,7 C. 8,2,9,3,5,7,6 D. 8,3,2,9,6,5,7
【Python版】采用冒泡排序算法对某数据序列进行排序,经过第一轮排序后的结果是“2,8,3,9,5,6,7”,那么原数据序列不可能的是 A. [8,3,9,5,2,7,6] B. [8,3,9,2,6,5,7] C. [8,2,9,3,5,7,6] D. [8,3,2,9,6,5,7]
【解析】冒泡排序第一轮会将最小数移到首位,D选项第一轮应将2移到首位,结果为[2,8,3,5,9,6,7],与题干结果不符,故不可能,选D。
四、选择题第12题:对分查找过程判断
【2021年1月原题】某对分查找算法的VB程序段如下:
’随机产生包含20 个整型元素的升序序列,依次存入数组a,代码略i = 1 :j = 20 :s=" "key = Val(Textl. Text)DoWhile i < = jm = ( i + j ) \ 2s = s + Str(a(m))If a(m)= key Then Exit DoIf a(m)> key Thenj = m - 1 Else i = m + 1LoopText2. Text = s
在文本框Text1中输入待查找数,执行该程序段后,下列选项中,文本框Text2中显示的内容不可能的是 A. 78 50 46 33 B. 51 37 41 48 C. 74 50 46 51 D. 73 83 87 96
【Python版】生成包含20个元素的升序数组a,对分查找key,Python程序如下:
# 随机产生包含20 个整型元素的升序序列,依次存入数组a,代码略i =0j =19s =""key =int(input())while i <= j:m = (i + j) //2s +=str(a[m]) +" "if a[m] == key:breakif a[m] > key:j = m -1else:i = m +1print(s)
输入key,输出结果不可能的是 A. 78 50 46 33 B. 51 37 41 48 C. 74 50 46 51 D. 73 83 87 96
【解析】C选项中50>46后又出现51,不符合升序对分逻辑,不可能,选C。
五、非选择题第15题:双人组队挑选算法
【2021年1月原题】根据申请人的QA和QB值,从m个申请人中挑选2人组队参加某挑战赛。条件一是2人的QA值都必须大于指定参数h;条件二是2人的QA值之差(较大值减较小值)小于h。在满足上述两个条件的所有2人组合中,挑选QB值之和最大的一个组合。 编写VB程序,实现上述挑选功能。运行程序,在文本框Text1中输入参数h后,单击“挑选”按钮Command1,在列表框List1中按QA值降序显示满足条件一的申请人信息,最后在标签Label1中显示组队结果。

VB代码设问略。
【Python版】根据申请人的QA和QB值,从m个申请人中挑选2人组队参加某挑战赛。条件一是2人的QA值都必须大于指定参数h;条件二是2人的QA值之差(较大值减较小值)小于h。在满足上述两个条件的所有2人组合中,挑选QB值之和最大的一个组合。程序运行如下图所示:

(1)完善划线处代码。
(2)加框处代码有误,请修正。
idh = [6,1,11,2,4,20,7,13]qa = [175,138,96,78,76,53,46,38]# QA值qb = [15,26,41,38,30,27,31,29]# QB值h =int(input("输入参数h:"))m =len(idh)n = m# 按QA降序排序,筛选QA>hfor i inrange(m -1):k = ifor j inrange(i +1, m):if qa[j] > qa[k]:k = jif qa[i] > h: # (2)加框处:qa[i] > hif k != i:qa[i], qa[k] = qa[k], qa[i]qb[i], qb[k] = qb[k], qb[i]idh[i], idh[k] = idh[k], idh[i]else:___①___breakmax_sum =0s ="没有满足条件的组合"# 查找符合条件的组合for i inrange(n -1, 0, -1):j = i -1while ___②___:if qb[i] + qb[j] > max_sum:s =f"组队结果:{idh[i]}号,{idh[j]}号"___③___j -=1print(s)
【答案】(1) ①i;②j >= 0 and abs(qa[i] - qa[j]) < h;③max_sum = qb[i] + qb[j](2) 原加框处qa(i) > h改正:qa[k] > h
六、非选择题第16题:物品柜放置模拟
【2021年1月原题】16.某物品柜有5层,每层有10个格子,每个格子只能放一个物品。第1层格子编号依次为1到10,第2层格子编号依次为11到20,依此类推。有9组物品(组号1~9),每组有2到8个物品,物品总数不超过50个。将9组物品按组号由小到大依次放入柜中,放置方式有两种: 编写VB程序,模拟物品放置。运行程序,在列表框Listl中显示每组物品的组号和数量,单击“放置”按钮Command1,在列表框List2中显示每组物品放置结果。

VB代码略

【Python版】某物品柜有5层,每层有10个格子,每个格子只能放一个物品。第1层格子编号依次为1到10,第2层格子编号依次为11到20,依此类推。有9组物品(组号1~9),每组有2到8个物品,物品总数不超过50个。将9组物品按组号由小到大依次放入柜中,放置方式有两种: 1)整体放置。按格子编号由小到大的次序查找第一个可放置该组全部物品的空区域(空区域是指从某个空格子开始的同层连续的所有空格子),若找到,则在该空区域居中、连续放置该组全部物品。 2)零散放置。若所有空区域格子数都小于该组物品数,则将该组每个物品依次放置在当前编号最小的空格子中。程序运行如下图所示:

(1)若第 1、第 2 组的物品数分别为 6 和 2,则放置第 2 组物品的格子编号依次为______
(2)完善程序中划线处代码。
m =50# 总格子数w =10# 每层格子数n =9# 组数f = [0] * (m +# f[1]~f[50]存储格子状态a = [0] * (n +# 每组物品数a[1]~a[9]# 模拟getpos函数:找可放r个物品的起始位置,无则-1def getpos(r):for i inrange(1, m +1):if f[i] >= r:return ireturn-1# 初始化格子空区域for i inrange(1, m +1):f[i] = w - (i -1) % wv =1for i inrange(1, n +1):s =""p = ___①___if p ==-1:j =1while j <= a[i]:if f[v] !=0:s +=str(v) +" "f[v] =0j +=1___②___else:k = (f[p] - a[i]) //2for j inrange(k):p +=1for j inrange(___③___):f[j] =0s +=str(j) +" "print(f"第{i +1}组:{s}")
【答案与解析】
(1) 第2组放置格子编号:12(或1,2) (2) ①getpos(a[i]);②v = v + 1;③p,p+a[i]① 调用函数获取整体放置起始位置; ② 零散放置时,v逐格递增查找空格; ③ 居中后从p开始连续放置a[i]个物品。