第八节 简单算法及其程序实现 同步练(含答案) 2025-2026学年高中信息技术 必修1 数据与计算

资源下载
  1. 二一教育资源

第八节 简单算法及其程序实现 同步练(含答案) 2025-2026学年高中信息技术 必修1 数据与计算

资源简介

第八节 简单算法及其程序实现
1. 某厂共有y件产品被抽检,其中,合格品数量为x,编写Python程序来计算该批次产品的合格率p,并保留两位小数。具体代码如下:
y=int(input("共有产品:"))
x=int(input("合格品数量为:"))
p=   
print("合格率为:",p)
横线上应填入的代码为( A )
A. int(100*x/y+0.5)/100
B. round(x/y)
C. x/y
D. int(10*x/y+0.5)/10
【解析】 合格率=合格品数量/总数,对p按四舍五入法保留两位小数,round(x/y)按四舍五入法保留整数,x/y取整数部分,int(10*x/y+0.5)/10按四舍五入法保留1位小数。
2. 若一个三位数等于其各位上数字的立方和,则称这个数为“水仙花数”。例如:371=33+73+13,371就是一个“水仙花数”。利用如下Python程序可实现判定输入的一个三位数是否为“水仙花数”:
number=int(input("请输入一个三位数:"))
x=number//100
y= ① 
z=number%10
if  ② :
  print(number,"是 水仙花数 ")
else:
  print(number,"不是 水仙花数 ")
横线上应填入的代码为( B )
A. ①number%100  ②x**3+y**3+z**3==number
B. ①number%100//10  ②x**3+y**3+z**3==number
C. ①number/10%10  ②x**3+y**3+z**3==number
D. ①number/10  ②x**3+y**3+z**3===number
【解析】 ①根据程序可知,y是取所输入三位数的十位上的数字,应填入代码为number%100//10或number//10%10;②根据“水仙花数”的定义,应填入的代码为x**3+y**3+z**3=number。
3. 某Python程序如下:
a=[2, 4, 5, 7, 1]
m=0
s=0
for i in range(5) :
  if a[i]>m:
    m=a[i]+1
  else:
    m=a[i]-1
  s=s+m
print(s)
程序运行后,输出的结果是( A )
A. 20 B. 21
C. 22 D. 23
【解析】 第一次循环:2>0,m=3;第二次循环:4>3,m=5;第三次循环:5=5,
m=4;第四次循环:7>4,m=8;第五次循环:1<8,m=0;所以s=3+5+4+8+
0=20。
4. 某Python程序如下:
x=int(input("输入x:"))
if x<=2:
  y=x**2
elif x<=5:
  y=2*x-3
else:
  y=1/x
print(y)
程序运行后,输入x的值为4,输出的结果为( C )
A. 2 B. 8
C. 5 D. 0.25
【解析】 当输入x的值为4时,满足条件x<=5,执行语句y=2*x-3=2*4-
3=5,输出的结果为5。
5. 编写Python程序,实现“奇偶归一”猜想。“奇偶归一”猜想是指一个大于1的正整数x, 如果是奇数,就乘3再加1;如果是偶数,就变为原来的一半。这样经过若干次,最终变回1。具体代码如下,程序运行界面如图所示。
第5题图
x=int(input("输入一个大于1的正整数:"))
print(x, "-", end="")
while x!=1:
  if ① 
     ② 
    print(x, ">>", end="")
  else:
     ③ 
if  ④ 
   print(x)
else:
      print(x, ">>", end="")
横线上可选语句如下:
a.x==1 b.x=x//2 c.x=3*x+1 d.x%2==1
横线上依次填入的代码应为( C )
A. abcd B. cdba
C. dcba D. dbca
【解析】 第一个if条件语句用来判断是奇数还是偶数,并执行对应的算法,①处应填入的代码为x%2==1,②处应填入的代码为x=3*x+1,③处应填入的代码为x=x//2,第二个if条件语句是用来判断数为1时要进行的操作,④处应填入的代码为x==1。
6. 下列问题中,不适合用枚举算法解决的是( D )
A. 输出1000以内的素数
B. 在一串钥匙中寻找能打开指定锁的钥匙
C. 列出用10元和50元凑成240元的所有组合方式
D. 已知小球做自由落体运动,求小球在3秒内下落的距离
【解析】 A选项,需要对1000以内的每个数进行判断;B选项,需要对每把钥匙依次进行试验;C选项,设10元取a张,50元取b张,a取0和24之间的整数,b取0和4之间的整数,将a、b取值的所有可能组合逐一代入表达式10*a+50*
b==240,判断是否成立,若成立,则组合方式符合要求,上述选项都符合枚举算法的思想;D选项,利用自由落体公式求下落的距离,属于解析算法思想。
7. 用枚举算法求解“找出所有满足‘各位上的数字之和等于6’条件的四位数”时,下列所列举的数值范围内,算法执行效率最高的是( D )
A. 从0到9999 B. 从1000到9999
C. 从1000到6000 D. 从1005到6000
【解析】 影响枚举算法效率的重要因素是枚举的次数,满足“各位上的数字之和等于6”条件的最小四位数是1005,最大四位数是6000。此范围内包含所有满足条件的解,且需要列举的数字最少,故在所有选项中算法的执行效率最高。
8. 面额为1元、2元和5元的纸币各有10张,求总额恰好为32元的取法的算法如下:设1元取a张,2元取b张,5元取c张。a,b,c都取0和10之间的整数,将a,b,c取值的所有可能组合逐一代入表达式a+2*b+5*c==32, 判断是否成立,若成立,则输出这种取法。此算法属于( D )
A. 排序算法 B. 对分查找
C. 解析算法 D. 枚举算法
【解析】 题中将a,b,c取值的所有可能组合逐一代入表达式,判断是否成立,若成立,则输出这种取法,这属于枚举算法。
9. 某Python程序如下:
import random
a=[5]*5
i=1
while i<=4:
  a[i]=a[i-1]-random.randint(0,1)
   random.randint(a,b)随机生成一个[a,b]范围内的整数
  i+=1
print(a)
程序运行后,输出的结果可能是( B )
A. [1,2,3,4,5]
B. [5,5,4,3,2]
C. [4,3,2,0,-1]
D. [5,3,1,1,1]
【解析】 本题主要考查Python程序的执行与调试。random.randint(a,b)随机生成一个[a,b]范围内的整数,random.randint(0,1)随机生成0或者1。由代码
“a[i]=a[i-1]-random.randint(0,1)”可知,前面的元素值比后面的元素值大0或1,由选项可知,输出的结果可能是[5,5,4,3,2]。
10. 元旦义卖:总共带60件商品,有钥匙扣、漫画书两种商品,钥匙扣2元一个,漫画书4元一本。若要卖出200元,需如何搭配 下列Python程序用于输出所有可能的组合:
s=0 #统计所有可能的组合数量
for b in range(1, 50) :
  a=      
  if 2*a+4*b==200:
    s=s+1
    print(f"组合{s}: 钥匙扣{a}个,漫画书{b}本")
横线上应填入的代码是( A )
A. 60-b B. 200-b
C. (200-4*a) /2 D. (200-4*b) /2
【解析】 由题意可知共带60件商品,a和b分别表示钥匙扣和漫画书的数量,因为枚举条件表达式为2*a+4*b=200,故a=60-b。反过来看,若为a赋值为(200-4*b) /2,则枚举条件表达式要改成a+b=60。
11. 将5万元存入银行,如果首次存款时的年利率是3.25%,到期后自动转存时年利率分别是3%,3%,2%,1.75%,那么5年后存款总额是多少 现编写Python程序,请在横线上填入合适的代码:① rate=[0.0325,0.03,0.03,0.02,0.0175] ,② money=round(money*(1+i)) 。
money=50000
  ①  
for i in rate:
    ②  
print("5年后存款总额:",money,"元")
input("运行完毕,请按回车键退出……")
【解析】 本题主要考查Python的应用。首次存款时的年利率是3.25%,到期后自动转存时的利率分别是3%,3%,2%,1.75%,由代码“for i in rate:”可知,初始要将年利率存放在rate中,故第一空答案应为rate=[0.0325,0.03,0.03,0.02,0.0175];循环体中要计算每年到期后的金额是多少,故第二空答案应为money=round(money*(1+i))。
12. 素数是指在大于1的自然数中,除了1和该整数本身外,不能被其他自然数整除的数。例如11,它只能被1和11整除,所以11是素数。回文数指正着读和反着读都一样的数,例如12321,它正着读、反着读都一样,是回文数。
编写Python程序,实现如下功能:找出100~n内的所有回文素数(n为大于或等于100的正整数)。
(1)如果n=1000,在本题的程序末尾添加print(151 in L),输出的结果是
 True 。
(2)请在横线上填入合适的代码:① n%i==0 ,② n>0或n!=0 ,
③ rev(i)==i 。
import math
def prime(n): #判断n是否为素数
i=2
k=int(math.sqrt(n))
while i<=k:
  if  ① :
    break
  i=i+1
return i>k
def rev(n):#倒转数字
t=0
while  ② :
  t=t*10+n%10
  n=n//10
return t
n=int(input( 请输入整数n: ))
L=[]
for i in range(100,n+1):
if  ③ :
  if prime(i)==True:
    L=L+[i]
print ( 100~n内的回文素数: ,L)
【解析】 本题主要考查Python的综合应用。(1)151是素数,同时也是回文数,故输出的结果是True。(2)若能被其他自然数整除,则表明不是素数,跳出循环,故第一空的答案应为n%i==0;将n的每一位进行倒转,直到每一位都倒转完,故第二空的答案为n>0或n!=0;第三空的答案是判断是否为回文数,即倒转后的数跟原来的数相等,故应为rev(i)==i。
13. 编写程序,实现下列功能:输入一个二进制数,将二进制数转换为十进制数,并输出结果。程序运行效果如图所示。
第13题图
用Python语言编写的程序如下,请回答下列问题。
 x=input("请输入二进制数:")
  ① 
 s=0
 for i in range(n):
 ② 
 print("二进制数:",x,"转换为十进制数为:",s)
(1)当输入二进制数为111011,则程序输出的十进制数为 59 。
(2)请写出程序中横线上应填入的代码。
①处应填入的代码为 n=len(x) ;
②处应填入的代码为 s=s+int(x[i])*pow(2,n-i-1)或s=s+int(x[i])*2**(n-i-1) 。
【解析】 本题主要考查Python循环语句。(1)根据二进制转十进制的方法计算可得,111011B=59D,因此答案为59。(2)根据语句range(n)可知,n为字符串的长度,因此①处代码为n=len(x);将二进制转换为十进制数的方法为用二进制位上的数字乘2y,y为该数从右往左的位置号减1,也可从左往右计算,最高位为2的(二进制长度-1)次方,以此类推,从左往右第i位为2n-i-1,因此②处代码为
s=s+int(x[i])*pow(2,n-i-1),也可以写为s=s+int(x[i])*2**(n-i-1)。
14. 某邮箱的密码信息如下:①密码是六位数,前两位为81。②最后两位数字相同。③能被16和86整除。
编写Python程序找出可能的密码,具体代码如下:
for i in range(0, 10000, ① ):
  s=810000+i
  if s%86=0:
    a= ② 
    b=s//10%10
    if a==b:
      print(s)
请回答下列问题:
(1)解决此问题的算法是 枚举算法 (填“枚举算法”或“解析算法”)。
(2)请在横线上填入合适的代码:① 16 ,② s%10 或 i%10 。
【解析】 (1)此题中列出所有可能的情况,并验证是否正确,符合枚举算法的基本思想。(2)根据range函数的语法结构,程序中①处只能填写range函数的步长(step),题干中说明密码能被16和86整除,但代码中只判断了s是否能被86整除,说明要通过控制i的值确保s能被16整除,又因为810000恰好能被16整除,故步长是16;易知变量a和b分别存储个位上的数字和十位上的数字,故a=s%10或a=i%10。
15. 人民币是中华人民共和国的法定货币,单位是元。现将一张100元钞票换成面额为20元、10元、5元、1元的等值钞票,要求每次换成30张钞票,且每种至少有1张,找出所有的换法并统计换法种数。现编写如下Python程序实现该问题的求解,请在横线上填入合适的代码:① c in range(1,14) ,② d=30-a-b-c ,③ i+=1 。
i=0
for a in range(1, 5) :
  for b in range(1, 8) :
    for ① :
       ② 
      if 20*a+10*b+5*c+d==100:
         ③ 
      print(“20元、10元、5元和1元的张数分别为:”,a, b, c, d)
print(“共有”+str(i) +“种换法”)
【解析】 由于4种面额的钞票每种至少有一张,所以可换成20元的张数范围是1到4,可换成10元的张数范围是1到7,可换成5元的张数范围是1到13,则30减去前三者的张数后剩下的即为1元的张数。如此嵌套循环,当符合条件时输出结果并统计换法种数。
16. “百钱买百鸡”是中国古代数学家张丘建在《算经》一书中提出的一个著名数学问题:“今有鸡翁,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何 ”假设每一种鸡的数量都不少于1只,则可以写出如下程序:
n= ① 
for Jiweng in range(1,21):
  for Jimu in range(1,34):
    Jichu= ② 
    if (Jiweng*5+Jimu*3+Jichu/3==100):
      print("鸡翁:%d 鸡母:%d 鸡雏:%d"%(Jiweng,Jimu,Jichu))
      n=n+1
print(n)
请在横线上填入合适的代码:① 0 ,② 100-Jiweng-Jimu 。
【解析】 本题主要考查Python程序设计。变量n用于统计有多少种可能,初始值为0,故①处填0。一共100只鸡,即鸡翁、鸡母和鸡雏共100只,②处表示Jichu的数量,故为100-Jiweng-Jimu。
17. 角谷猜想。
任意一个大于1的正整数n,重新进行下列运算:
◆ 若n为奇数,n的值替换为 3 * n + 1
◆ 若n为偶数,n的值替换为 n // 2
经过若干次上述变换,正整数n的最终值一定会是1。
请你编写Python程序代码,检测上面的角谷猜想是否可行。
n=int(input("请输入n的值:"))
step=0
while n!=1:
  step=step+1
  if n%2==0:
    print( 第 , step, 步: ,n, //2= , n//2)
    n= ① 
  else:
    print( 第 , step, 步: 3* , n, +1= , 3*n + 1)
    n= ② 
(1)请在横线上填入合适的代码:① n//2 ,② 3*n+1 。
(2)代码分析:若输入n的值是5,则程序结束后变量step的值是 5 。
【解析】 程序运行步骤如下:
第 1 步: 3* 5 +1= 16
第 2 步: 16 //2= 8
第 3 步: 8 //2= 4
第 4 步: 4 //2= 2
第 5 步: 2 //2= 1
18. 完全数又称完美数或完备数,是一类特殊的自然数。它的所有真因子(即一个数除去它自身以外的约数)的和(即因子函数),恰好等于它本身。Python程序代码如下,找出1000以内的所有完全数。请在横线上填入合适的代码:
① 2, m//2+1 ,② m%i==0 。
def perfect(m):
  if m <=1: return False
  sum=1
  for i in range(  ①  ):
    if   ②  :
      sum+=i
  return m==sum
list1=[]
for i in range(1, 1001):
  if perfect(i):
    list1.append(i)
print(list1)
【解析】 本题采用枚举算法,由于1是所有数的因子,所以我们只枚举除1和m之外的所有因子,①答案为:2,m-1。但从算法效率思考:由于最小因子是2,最大因子是m//2,所以最佳答案为2,m//2+1,这样处理算法的效率将提升一倍。②处需要判断i是否为m的约数,应填写的代码是 m%i==0。
19. 小张收集了章回体小说《三国演义》第1回至第120回的120个文件,文件名依次为sg1.txt、sg2.txt、…、sg120.txt。他编写Python程序,对书中人物同时出现的情况进行简单分析,将人物及其别名(如“孟德”是“曹操”的别名)当作同一个人进行处理。运行程序,用户输入“曹操|孟德 刘备|玄德”,输出结果如图所示,图中[11,28]表示曹操、刘备在第11回至第28回同时出现。
第19题图
请回答下列问题:
(1)观察上图,可知曹操与刘备在第36回中 A (单选,填字母)出现。
A. 同时 B. 不同时
主程序如下:

输入姓名、别名,姓名存入列表 names,如 names=["曹操","刘备"]
统计各回中,列表 names 中每个人物(含别名)出现的次数,将结果存入字典 total,如 total={"曹操":[2,5,7,...], "刘备": [50,47,0,...]},表示曹操在第1,2,3,...回分别出现了2,5,7,...次
代码略

num, result=calculate(total)
mlen=getMaxLen(result)
print("人物同时出现的回数为:", num, ",回依次为:")
print(result)
print("人物同时出现的最大连续回数是:",mlen)
(2)定义函数calculate(total),功能是统计列表names中人物同时出现的回数,以及同时出现的回,结果示例如上图所示,请在横线上填入合适的代码:
 num+=1 或num=num+1 。
def calculate(total):
  num, length=0,0 num保存120回中人物同时出现的回数
  result=[]  result[i][0]、result[i][1]分别存储第i+1段回的起、止回号
  k=-1
  for i in range(0, 120):
    if allIn(total, i):
         
      if length==0:
        begin=i+1
      result.append([begin, begin])
  # 在列表 result 末尾添加一个元素
        k+=1
      length+=1
      result[k][1]=i+1
    else:
      length=0
  return num, result
(3)定义函数 getMaxLen(result),功能是统计最大连续回数,请在横线上填入合适的代码: mlen 。
def getMaxLen(result):
  mlen=0
  for item in result:
    t=item[1]-item[0]+1
    if t >    :
      mlen=t
  return mlen
(4)定义函数allIn(total, cno),功能是判断列表names中人物是否同时出现在第cno+1回中,若同时出现,返回True,请在横线上填入合适的代码:
 total[item][cno]==0 。
def allIn(total, cno):
  for item in names:
    if     :
      return False
  return True
【解析】 本题考查Python语言基础及字符串处理的综合知识。(1)观察图可知,第36回出现在[31,45]中,表明曹操与刘备这两个人物在第36回同时出现。(2)由于num保存120回中人物同时出现的回数,其初始值为0,因此若检查到符合条件时,即调用函数allIn(total, cno)且其值为True时,计数器num加1,因此其表达式为num+=1。(3)此处统计最大连续回数,变量mlen即为返回值。在循环中,将连续回数t与最大值mlen进行比较,若有比最大值mlen更大的值t,则将t赋值给mlen,故答案是mlen。(4)由于 total={"曹操":[2,5,7,...],"刘备":[50,47,0,...]},表示曹操在第1,2,3,...回分别出现了2,5,7,...次。根据这个信息可知total是一个字典,item是某人物名,cno是某回号的值,因此若total[item][cno]==0,则表明人物item在回号cno中出现的次数为0,故函数返回值为False,反之则返回True。(共34张PPT)
第八节 简单算法及其程序实现
信息技术 必修1 数据与计算
算法的程序实现
第三章
必备知识练
1. 某厂共有y件产品被抽检,其中,合格品数量为x, 编写Python程序来计算该批次产品的合格率p,并保留两位小数。具体代码如下:
y=int(input("共有产品:"))
x=int(input("合格品数量为:"))
p=   
print("合格率为:",p)
横线上应填入的代码为(  )
A. int(100*x/y+0.5)/100
B. round(x/y)
C. x/y
D. int(10*x/y+0.5)/10
【解析】 合格率=合格品数量/总数,对p按四舍五入法保留两位小数,round(x/y)按四舍五入法保留整数,x/y取整数部分,int(10*x/y+0.5)/10按四舍五入法保留1位小数。
A
2. 若一个三位数等于其各位上数字的立方和,则称这个数为“水仙花数”。例如:371=33+73+13,371就是一个“水仙花数”。利用如下Python程序可实现判定输入的一个三位数是否为“水仙花数”:
number=int(input("请输入一个三位数:"))
x=number//100
y= ① 
z=number%10
if  ② :
  print(number, "是 水仙花数 ")
else:
  print(number,"不是 水仙花数 ")
横线上应填入的代码为(  )
A. ①number%100  ②x**3+y**3+z**3==number
B. ①number%100//10  ②x**3+y**3+z**3==number
C. ①number/10%10  ②x**3+y**3+z**3==number
D. ①number/10  ②x**3+y**3+z**3===number
B
【解析】 ①根据程序可知,y是取所输入三位数的十位上的数字,应填入代码为number%100//10或number//10%10;②根据“水仙花数”的定义,应填入的代码为x**3+y**3+z**3=number。
3. 某Python程序如下:
a=[2, 4, 5, 7, 1]
m=0
s=0
for i in range(5) :
  if a[i]>m:
    m=a[i]+1
  else:
    m=a[i]-1
  s=s+m
print(s)
程序运行后,输出的结果是(  )
A. 20 B. 21
C. 22 D. 23
【解析】 第一次循环:2>0,m=3;第二次循环:4>3,m=5;第三次循环:5=5,m=4;第四次循环:7>4,m=8;第五次循环:1<8,m=0;所以s=3+5+4+8+0=20。
A
4. 某Python程序如下:
x=int(input("输入x:"))
if x<=2:
  y=x**2
elif x<=5:
  y=2*x-3
else:
  y=1/x
print(y)
程序运行后,输入x的值为4,输出的结果为(  )
A. 2 B. 8
C. 5 D. 0.25
【解析】 当输入x的值为4时,满足条件x<=5,执行语句y=2*x-3=2*4-3=5,输出的结果为5。
C
5. 编写Python程序,实现“奇偶归一”猜想。“奇偶归一”猜想是指一个大于1的正整数x, 如果是奇数,就乘3再加1;如果是偶数,就变为原来的一半。这样经过若干次,最终变回1。具体代码如下,程序运行界面如图所示。
输入一个大于1的正整数:5
5-16>>8>>4>>2>>1
x=int(input("输入一个大于1的正整数:"))
print(x, "-", end="")
while x!=1:
  if ① 
     ② 
    print(x, ">>", end="")
  else:
     ③ 
if  ④ 
   print(x)
else:
      print(x, ">>", end="")
横线上可选语句如下:
a.x==1 b.x=x//2 c.x=3*x+1 d.x%2==1
横线上依次填入的代码应为(  )
A. abcd B. cdba
C. dcba D. dbca
【解析】 第一个if条件语句用来判断是奇数还是偶数,并执行对应的算法,①处应填入的代码为x%2==1,②处应填入的代码为x=3*x+1,③处应填入的代码为x=x//2,第二个if条件语句是用来判断数为1时要进行的操作,④处应填入的代码为x==1。
C
6. 下列问题中,不.适.合.用枚举算法解决的是(  )
A. 输出1000以内的素数
B. 在一串钥匙中寻找能打开指定锁的钥匙
C. 列出用10元和50元凑成240元的所有组合方式
D. 已知小球做自由落体运动,求小球在3秒内下落的距离
【解析】 A选项,需要对1000以内的每个数进行判断;B选项,需要对每把钥匙依次进行试验;C选项,设10元取a张,50元取b张,a取0和24之间的整数,b取0和4之间的整数,将a、b取值的所有可能组合逐一代入表达式10*a+50*b==240,判断是否成立,若成立,则组合方式符合要求,上述选项都符合枚举算法的思想;D选项,利用自由落体公式求下落的距离,属于解析算法思想。
D
7. 用枚举算法求解“找出所有满足‘各位上的数字之和等于6’条件的四位数”时,下列所列举的数值范围内,算法执行效率最高的是(  )
A. 从0到9999 B. 从1000到9999
C. 从1000到6000 D. 从1005到6000
【解析】 影响枚举算法效率的重要因素是枚举的次数,满足“各位上的数字之和等于6”条件的最小四位数是1005,最大四位数是6000。此范围内包含所有满足条件的解,且需要列举的数字最少,故在所有选项中算法的执行效率最高。
D
8. 面额为1元、2元和5元的纸币各有10张,求总额恰好为32元的取法的算法如下:设1元取a张,2元取b张,5元取c张。a,b,c都取0和10之间的整数,将a,b,c取值的所有可能组合逐一代入表达式a+2*b+5*c==32, 判断是否成立,若成立,则输出这种取法。此算法属于
(  )
A. 排序算法 B. 对分查找
C. 解析算法 D. 枚举算法
【解析】 题中将a,b,c取值的所有可能组合逐一代入表达式,判断是否成立,若成立,则输出这种取法,这属于枚举算法。
D
9. 某Python程序如下:
import random
a=[5]*5
i=1
while i<=4:
  a[i]=a[i-1]-random.randint(0,1)
   random.randint(a,b)随机生成一个[a,b]范围内的整数
  i+=1
print(a)
程序运行后,输出的结果可能是(  )
A. [1,2,3,4,5] B. [5,5,4,3,2]
C. [4,3,2,0,-1] D. [5,3,1,1,1]
【解析】 本题主要考查Python程序的执行与调试。random.randint(a,b)随机生成一个[a,b]范围内的整数,random.randint(0,1)随机生成0或者1。由代码“a[i]=a[i-1]-random.randint(0,1)”可知,前面的元素值比后面的元素值大0或1,由选项可知,输出的结果可能是[5,5,4,3,2]。
B
10. 元旦义卖:总共带60件商品,有钥匙扣、漫画书两种商品,钥匙扣2元一个,漫画书4元一本。若要卖出200元,需如何搭配 下列Python程序用于输出所有可能的组合:
s=0 #统计所有可能的组合数量
for b in range(1, 50) :
  a=      
  if 2*a+4*b==200:
    s=s+1
    print(f"组合{s}: 钥匙扣{a}个,漫画书{b}本")
横线上应填入的代码是(  )
A. 60-b B. 200-b
C. (200-4*a) /2 D. (200-4*b) /2
【解析】 由题意可知共带60件商品,a和b分别表示钥匙扣和漫画书的数量,因为枚举条件表达式为2*a+4*b=200,故a=60-b。反过来看,若为a赋值为(200-4*b) /2,则枚举条件表达式要改成a+b=60。
A
关键能力练
11. 将5万元存入银行,如果首次存款时的年利率是3.25%,到期后自动转存时年利率分别是3%,3%,2%,1.75%,那么5年后存款总额是多少 现编写Python程序,请在横线上填入
合适的代码:①___________________________________________,
②__________________________________。
money=50000
  ①  
for i in rate:
    ②  
print("5年后存款总额:",money,"元")
input("运行完毕,请按回车键退出……")
【解析】 本题主要考查Python的应用。首次存款时的年利率是3.25%,到期后自动转存时的利率分别是3%,3%,2%,1.75%,由代码“for i in rate:”可知,初始要将年利率存放在rate中,故第一空答案应为rate=[0.0325,0.03,0.03,0.02,0.0175];循环体中要计算每年到期后的金额是多少,故第二空答案应为money=round(money*(1+i))。
rate=[0.0325,0.03,0.03,0.02,0.0175]
money=round(money*(1+i))
12. 素数是指在大于1的自然数中,除了1和该整数本身外,不能被其他自然数整除的数。例如11,它只能被1和11整除,所以11是素数。回文数指正着读和反着读都一样的数,例如12321,它正着读、反着读都一样,是回文数。
编写Python程序,实现如下功能:找出100~n内的所有回文素数(n为大于或等于100的正整数)。
(1)如果n=1000,在本题的程序末尾添加print(151 in L),输出的结果是__________。
True
(2)请在横线上填入合适的代码:①___________,②______________,③_____________。
import math
def prime(n): #判断n是否为素数
i=2
k=int(math.sqrt(n))
while i<=k:
  if  ① :
    break
  i=i+1
return i>k
def rev(n):#倒转数字
t=0
while  ② :
  t=t*10+n%10
  n=n//10
return t
n=int(input( 请输入整数n: ))
L=[]
for i in range(100,n+1):
if  ③ :
  if prime(i)==True:
    L=L+[i]
print ( 100~n内的回文素数: ,L)
n%i==0
n>0或n!=0
rev(i)==i
【解析】 本题主要考查Python的综合应用。(1)151是素数,同时也是回文数,故输出的结果是True。(2)若能被其他自然数整除,则表明不是素数,跳出循环,故第一空的答案应为n%i==0;将n的每一位进行倒转,直到每一位都倒转完,故第二空的答案为n>0或n!=0;第三空的答案是判断是否为回文数,即倒转后的数跟原来的数相等,故应为rev(i)==i。
13. 编写程序,实现下列功能:输入一个二进制数,将二进制数转换为十进制数,并输出结果。程序运行效果如图所示。
输入二进制数:110111
二进制数110111转换为十进制数为55
 x=input("请输入二进制数:")
  ① 
 s=0
 for i in range(n):
 ② 
 print("二进制数:",x,"转换为十进制数为:",s)
(1)当输入二进制数为111011,则程序输出的十进制数为__________。
(2)请写出程序中横线上应填入的代码。
①处应填入的代码为__________;
②处应填入的代码为________________________________________________________。
【解析】 本题主要考查Python循环语句。(1)根据二进制转十进制的方法计算可得, 111011B=59D,因此答案为59。(2)根据语句range(n)可知,n为字符串的长度,因此①处代码为n=len(x);将二进制转换为十进制数的方法为用二进制位上的数字乘2y,y为该数从右往左的位置号减1,也可从左往右计算,最高位为2的(二进制长度-1)次方,以此类推,从左往右第i位为2n-i-1,因此②处代码为s=s+int(x[i])*pow(2,n-i-1),也可以写为s=s+int(x[i])*2**(n-i-1)。
59
n=len(x)
s=s+int(x[i])*pow(2,n-i-1)或s=s+int(x[i])*2**(n-i-1)
14. 某邮箱的密码信息如下:①密码是六位数,前两位为81。②最后两位数字相同。
③能被16和86整除。
编写Python程序找出可能的密码,具体代码如下:
for i in range(0, 10000, ① ):
  s=810000+i
  if s%86=0:
    a= ② 
    b=s//10%10
    if a==b:
      print(s)
请回答下列问题:
(1)解决此问题的算法是__________(填“枚举算法”或“解析算法”)。
(2)请在横线上填入合适的代码:①__________,②______________。
【解析】 (1)此题中列出所有可能的情况,并验证是否正确,符合枚举算法的基本思想。 (2)根据range函数的语法结构,程序中①处只能填写range函数的步长(step),题干中说明密码能被16和86整除,但代码中只判断了s是否能被86整除,说明要通过控制i的值确保s能被16整除,又因为810000恰好能被16整除,故步长是16;易知变量a和b分别存储个位上的数字和十位上的数字,故a=s%10或a=i%10。
枚举算法
16
s%10 或 i%10
15. 人民币是中华人民共和国的法定货币,单位是元。现将一张100元钞票换成面额为20元、10元、5元、1元的等值钞票,要求每次换成30张钞票,且每种至少有1张,找出所有的换法并统计换法种数。现编写如下Python程序实现该问题的求解,请在横线上填入合适的代码:①________________,②__________________,③__________。
i=0
for a in range(1, 5) :
  for b in range(1, 8) :
    for ① :
       ② 
      if 20*a+10*b+5*c+d==100:
         ③ 
      print(“20元、10元、5元和1元的张数分别为:”,a, b, c, d)
print(“共有”+str(i) +“种换法”)
【解析】 由于4种面额的钞票每种至少有一张,所以可换成20元的张数范围是1到4,可换成10元的张数范围是1到7,可换成5元的张数范围是1到13,则30减去前三者的张数后剩下的即为1元的张数。如此嵌套循环,当符合条件时输出结果并统计换法种数。
c in range(1,14)
d=30-a-b-c
i+=1
16. “百钱买百鸡”是中国古代数学家张丘建在《算经》一书中提出的一个著名数学问题:“今有鸡翁,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何 ”假设每一种鸡的数量都不少于1只,则可以写出如下程序:
n= ① 
for Jiweng in range(1,21):
  for Jimu in range(1,34):
    Jichu= ② 
    if (Jiweng*5+Jimu*3+Jichu/3==100):
      print("鸡翁:%d 鸡母:%d 鸡雏:%d"%(Jiweng,Jimu,Jichu))
      n=n+1
print(n)
请在横线上填入合适的代码:①__________,②__________________________。
【解析】 本题主要考查Python程序设计。变量n用于统计有多少种可能,初始值为0,故①处填0。一共100只鸡,即鸡翁、鸡母和鸡雏共100只,②处表示Jichu的数量,故为100-Jiweng-Jimu。
0
100-Jiweng-Jimu
17. 角谷猜想。
任意一个大于1的正整数n,重新进行下列运算:
◆ 若n为奇数,n的值替换为 3 * n + 1
◆ 若n为偶数,n的值替换为 n // 2
经过若干次上述变换,正整数n的最终值一定会是1。
请你编写Python程序代码,检测上面的角谷猜想是否可行。
n=int(input("请输入n的值:"))
step=0
while n!=1:
  step=step+1
  if n%2==0:
    print( 第 , step, 步: ,n, //2= , n//2)
    n= ① 
  else:
    print( 第 , step, 步: 3* , n, +1= , 3*n + 1)
    n= ② 
(1)请在横线上填入合适的代码:①__________,②__________。
(2)代码分析:若输入n的值是5,则程序结束后变量step的值是__________。
n//2
3*n+1
5
【解析】 程序运行步骤如下:
第 1 步: 3* 5 +1= 16
第 2 步: 16 //2= 8
第 3 步: 8 //2= 4
第 4 步: 4 //2= 2
第 5 步: 2 //2= 1
18. 完全数又称完美数或完备数,是一类特殊的自然数。它的所有真因子(即一个数除去它自身以外的约数)的和(即因子函数),恰好等于它本身。Python程序代码如下,找出1000以内的所有完全数。请在横线上填入合适的代码:①______________,
②____________。
def perf____ect(m):
  if m <=1: return False
  sum=1
  for i in range(  ①  ):
    if   ②  :
      sum+=i
  return m==sum
list1=[]
for i in range(1, 1001):
  if perfect(i):
    list1.append(i)
print(list1)
2, m//2+1
m%i==0
【解析】 本题采用枚举算法,由于1是所有数的因子,所以我们只枚举除1和m之外的所有因子,①答案为:2,m-1。但从算法效率思考:由于最小因子是2,最大因子是m//2,所以最佳答案为2,m//2+1,这样处理算法的效率将提升一倍。②处需要判断i是否为m的约数,应填写的代码是 m%i==0。
19. 小张收集了章回体小说《三国演义》第1回至第120回的120个文件,文件名依次为sg1.txt、sg2.txt、…、sg120.txt。他编写 Python 程序,对书中人物同时出现的情况进行简单分析,将人物及其别名(如“孟德”是“曹操”的别名)当作同一个人进行处理。运行程序,用户输入“曹操|孟德 刘备|玄德”,输出结果如图所示,图中[11,28]表示曹操、刘备在第11回至第 28回同时出现。
人物同时出现的回数为:72,回依次为:
[[1,2],[5,6],[11,28],[31,45],[47,52],[54,58],[60,74],[77,82],[106,106],[119,120]]
人物同时出现的最大连续回数是:18
请回答下列问题:
(1)观察上图,可知曹操与刘备在第36回中__________(单选,填字母)出现。
A. 同时 B. 不同时
主程序如下:

输入姓名、别名,姓名存入列表 names,如 names=["曹操","刘备"]
统计各回中,列表 names 中每个人物(含别名)出现的次数,将结果存入字典 total,如 total={"曹操":[2,5,7,...], "刘备": [50,47,0,...]},表示曹操在第 1,2,3,...回分别出现了 2,5,7,...次
代码略

num, result=calculate(total)
mlen=getMaxLen(result)
print("人物同时出现的回数为:", num, ",回依次为:")
print(result)
print("人物同时出现的最大连续回数是:",mlen)
A
(2)定义函数 calculate(total),功能是统计列表 names 中人物同时出现的回数,以及同时出现的回,结果示例如上图所示,请在横线上填入合适的代码:_____________________________。
def calculate(total):
  num, length=0,0 num保存120回中人物同时出现的回数
  result=[]  result[i][0]、result[i][1]分别存储第i+1段回的起、止回号
  k=-1
  for i in range(0, 120):
    if allIn(total, i):
         
      if length==0:
        begin=i+1
      result.append([begin, begin])
  # 在列表 result 末尾添加一个元素
        k+=1
      length+=1
      result[k][1]=i+1
    else:
      length=0
  return num, result
num+=1 或num=num+1
(3)定义函数 getMaxLen(result),功能是统计最大连续回数,请在横线上填入合适的代码:__________。
def getMaxLen(result):
  mlen=0
  for item in result:
    t=item[1]-item[0]+1
    if t >    :
      mlen=t
  return mlen
mlen
(4)定义函数allIn(total, cno),功能是判断列表names中人物是否同时出现在第cno+1回中,若同时出现,返回True,请在横线上填入合适的代码:_______________________。
def allIn(total, cno):
  for item in names:
    if     :
      return False
  return True
total[item][cno]==0
【解析】 本题考查Python语言基础及字符串处理的综合知识。(1)观察图可知,第36回出现在[31,45]中,表明曹操与刘备这两个人物在第36回同时出现。(2)由于num保存120回中人物同时出现的回数,其初始值为0,因此若检查到符合条件时,即调用函数allIn(total, cno)且其值为True时,计数器num加1,因此其表达式为num+=1。 (3)此处统计最大连续回数,变量mlen即为返回值。在循环中,将连续回数t与最大值mlen进行比较,若有比最大值mlen更大的值t,则将t赋值给mlen,故答案是mlen。(4)由于 total={"曹操":[2,5,7,...], "刘备": [50,47,0,...]},表示曹操在第 1,2,3,...回分别出现了 2,5,7,...次。根据这个信息可知total是一个字典,item是某人物名,cno是某回号的值,因此若total[item][cno]==0,则表明人物item在回号cno中出现的次数为0,故函数返回值为False,反之则返回True。

展开更多......

收起↑

资源列表