第十一届蓝桥杯青少组Python省赛真题解

单选题1:

  以下Python不支持的数据类型有(  )。A、char    B、int    C、float    D、list

答案: A    Python只有字符串str。运行下面的程序:

      t='A'      print(ord(t),type(t))      结果是:      65 <class 'str'>单选题2:  以下选项中符合Python语言变量命名规则的是(  )。

A、*i    B、3_1    C、AI!    D、Templist

答案:D。一般指在英文操作系统,由大小英文字母、数字和下划线组成,首字母不可以为数字。

单选题3:

  以下哪个选项是正确的字符串(  )。

A、'abc" ab"  B、'abc' ab'  C、"abc" ab"  D、"abc\" ab"

答案:D。  单引号和双引号都可以用于字符串,但必须成对;单引号对内可以有双引号(例如:'abc" ab'是合法的);双引号对内可以有单引号(例如:"abc' ab"是合法的);但如果有相同的引号就要加转义符——反斜杠(\)。

单选题4:

  以下不能创建字典的语句是(  )。

A、dict1 = {}  B、dict2 = {3:5}  C、dict3 = {[1,2,3]:"uestc"}

D、dict4 = {(1,2,3):"usetc"}

答案:C。列表不可以作为主键,元组可以。

单选题5:

  已知ls = [3.5,  "Python",  [10,"LIST"], 3.6],那么ls[2][-1][1]的运行结果是(  )。

A、I    B、P    C、Y    D、L

 

 

 

答案:A。 ls[2] = [10,"LIST"],ls[2][-1] = "LIST", ls[2][-1][1]="I"。

编程题1:

  编程实现

  输入一个字符串,如果该字符串以er、ly或者ing结尾的,则删除该字符串后缀,并输出删除后的字符串,否则将原字符串输出。

  输入描述

  输入一个字符串

  输出描述

  输出删除后的字符串或原字符串

  样例输入

  driver

  样例输出

  driv

代码:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

s = input()slen = len(s)if slen > 1:    lchar = s[-1]    if lchar == 'r':        if s[-2] == 'e':            s = s[:slen-2]    elif lchar == 'y':        if s[-2] == 'l':            s = s[:slen-2]    elif lchar == 'g':        if slen > 2 and s[-2] == 'n' and s[-3] == 'i':            s = s[:slen-3]
print(s)

解说:

  先检查最后一个字母是否是'r'、'y'或'g';然后分别检查它们的前面是否是'e'、'l'或'in',按要求截取字符串。

  可用正则表达式解决,代码如下(未学过正则表达式的同学可以跳过):

· 

· 

· 

· 

· 

· 

· 

· 

import rep = re.compile("^(.*?)(?:er|ly|ing)$")s = input()o = p.match(s)if o:    print(o.group(1))else:    print(s)

· 

· 

import reprint(re.sub("(er|ly|ing)$""", input()))

 

编程题2:

  编程实现

  用户输入一个正整数a,作为如下图半圆的直径,同时作为如下图等腰直角三角形的直角边长度,求下图的阴影部分面积,如下所示:

 

 

 

  提示信息

  三角形面积公式:S=(ah)/2(公式中a为三角形的底边,h为底边所对应的高)

  圆形面积公式:S=πr²(公式中r为圆的半径,π=3.14)

 

  已知条件

  1)半圆的直径和等腰直角三角形直角边长度相同;

  2)三角形与半圆部分重叠;

  3)三角形ABC为等腰直角三角形。

 

  输入描述

  一个正整数(作为半圆的直径)

 

  输出描述

  图形阴影面积(保留2位小数)

 

  样例输入

  10

 

  样例输出

  25.00

 

代码:

· 

· 

· 

a = int(input())s = a*a/4print("%.02f" % s)

解说:割补法。整数相除(/)结果是浮点数。

编程题3:

  背景信息

  因子:因子也叫因数,例如3*5=15,那么3和5是15的因子。同时15*1=15,那么1和15也是15的因子。

  1,3,5,15这四个因子是15的所有因子。

  完数:如果一个数等于不含它本身的其他因子之和,则称该数位“完数”。如6的因子有1,2,3,6,且1+2+3=6,因此6是完数。

  编程实现

  输入一个正整数N,输出小于N的所有完数及个数(个数前加“*”,例如:*2)。

  输入描述

  输入一个整数N

  输出描述

  输出小于N的所有完数及个数

  样例输入:

  100

  样例输出:

  6

  28

  *2

代码:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

N = int(input())#因数分解(除了本身)def factors(n):    lst = [1]    factor2 = None    for j in range(2, n//2+1):        if factor2 != None and j >= factor2:            break        if n % j == 0:            factor2 = n // j            lst.append(j)            lst.append(factor2)    return lst    count = 0for i in range(2, N):    lst = factors(i)    if sum(lst) == i:        count += 1        print(i)        print("*%d" % count)

解说:

  本题的关键是如何编写程序分解因数,为此我们先研究因数分解的规律,例如96的因数分解:

因子1

2

3

4

6

8

12

因子2

48

32

24

16

12

8

  由上表可知,因子1增加过程中,因子2在减少(因子1×因子2=96,所以必然有这样的规律),当因子1达到或超过前一个因子2时,分解过程已结束。代码中的factors函数完成因数分解任务。

编程题4:

  背景信息

  在生活中,为了保证信息安全,我们会把重要的信息进行加密后再发送给对方,对方需要通过相同的策略对信息进行解密,才能了解到传递的信息。我们一般把加密前的信息称为明文,把加密后的信息称为密文。

  有这样一种加密策略:第一层加密策略是将明文中字母a加密为01,字母b加密为02,c加密为03,如此类推,x加密为24,y加密为25,z加密为26。空格不加密;然后在第一次加密的基础上进行第二次加密,第二次加密的策略是将数字0加密为27,数字1加密为28,如此类推,数字8加密为35,数字9加密为36,空格加密为00。

  编程实现

  请输入一段明文,按照上述的加密策略,输出对应的密文。

  输入描述

  输入一段明文(只包含小写字母和空格)

  输出描述

  按上述的加密策略,输出对应的密文。

  样例输入:

  ab c

  样例输出:

  27282729002730

代码:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

s = input()#第一次加密df1 = ord('a') - 1  #编码与ASCII码的差值rst1 = []for c in s:    if c == ' ':        rst1.append(c)        continue    d = ord(c) - df1    if d < 10:        rst1.append("0"+str(d))    else:        rst1.append(str(d))        #第二次加密df2 = ord('0') - 27rst2 = []for it in rst1:    if it == " ":        rst2.append("00")    else:        d1,d2 = ord(it[0])-df2, ord(it[1])-df2        rst2.append(str(d1))        rst2.append(str(d2))        print("".join(rst2))

解说:ord('a')=97,ord('A')=65,ord('0')=48,编码的顺序与ASCII的顺序相同。所以确定两个差值,就可以进行加密。

编程题5:

  编程实现

  夏至将至,《中国天文年历》显示,北京时间6月21日,也就是明天,夏至伴随着接天莲叶的碧,和映日荷花的红,即将盛装登场。夏至是中国“二十四节气”的第十个节气。“二十四节气”被列入联合国教科文组织人类非物质文化遗产名录。在国际气象界,这一已有千年历史的时间认知体系被誉为“中国第五大发明”。

  春雨惊春清谷天,夏满芒夏暑相连。秋处露秋寒霜降,冬雪雪冬小大寒。二十四节气,在四季轮回流淌,每个节气都有它较为稳定的日子。下表给出农历庚子年(公历2020年1月25日~2021年2月11日)中,二十四个节气的名称,公历具体日期及汉语拼音的缩写。

节气

日期

节气

日期

节气

日期

节气

日期

节气

日期

节气

日期

立春LC

2.4

雨水YS

2.19

惊蛰JZ

3.5

春分CF

3.2

清明QM

4.4

谷雨GY

4.19

立夏LX

5.5

小满XM

5.2

芒种MZ

6.5

夏至XZ

6.21

小暑XS

7.6

大暑DS

7.22

立秋LQ

8.7

处暑CS

8.22

白露BL

9.7

秋分QF

9.22

寒露HL

10.8

霜降SJ

10.23

立冬LD

11.7

小雪XX

11.22

大雪DX

12.7

冬至DZ

12.21

小寒XH

1.5

大寒DH

1.20

 

 

  输入描述

  输入一个日期,介于公历2020年1月25日~2021年1月20日之间,例如:2020年5月2日写为“2020*05*02”。

  输出描述

  如果当天恰好是一个节气,输出这个节气的汉语拼音缩写,如果当前不是节气则输出下一个节气的汉语拼音缩写。

  样例输入1:

  2020*06*21

  样例输出1:

  XZ

  样例输入2:

  2020*07*04

  样例输出2:

  XS

 

代码:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

jqDoc ='''立春LC  2.4  雨水YS  2.19  惊蛰JZ  3.5  春分CF  3.2  清明QM  4.4  谷雨GY  4.19立夏LX  5.5  小满XM  5.2  芒种MZ  6.5  夏至XZ  6.21  小暑XS  7.6  大暑DS  7.22立秋LQ  8.7  处暑CS  8.22  白露BL  9.7  秋分QF  9.22  寒露HL  10.8  霜降SJ  10.23立冬LD  11.7  小雪XX  11.22  大雪DX  12.7  冬至DZ  12.21  小寒XH  1.5  大寒DH  1.20'''jqLines = jqDoc.split("\n")jqTab = []for line in jqLines:    jqTab += line.split("  ")jqNames = jqTab[::2]def toDate(s):    m, d = map(int, s.split("."))    if m < 2:        m += 12    return m,djqDates = list(map(toDate, jqTab[1::2]))dt = input().split("*")(Y,M,D) = (int(d) for d in dt)if Y == 2021:    M += 12jq = -1  #默认最后一个节气for i in range(-2, -len(jqDates)-1,-1):    nxt = jqDates[i]    if nxt[0] < M or (nxt[0] == M and nxt[1] < D):        break    jq = iprint(jqNames[jq][2:])

解说:复制表格到文本字符串中,拆开各个值(先拆行,再拆列,表格列之间一般是2到4空格)。为了比较方便,如果是2021年,月份加1。

编程题6:

  编程实现

  · 现有一个容器,其容量为v(0<v<1001,正整数),同时有n个物品(0<n≤30),每个物品体积大小不同(正整数)。

  ·  n个物品中,任取若干个装入容器内,使容器的剩余空间为最小。

  输入描述

   输入容器大小v(0<v<1001,正整数),输入物品数量n(0<n≤30) 输入n个物体的大小。

  输出描述

  剩余空间大小

  样例输入:

  100

  4

  50

  20

  45

  19

  ”100“ 输入的是容器大小

  ”4”输入的是物品数量

  50“,”20”,“45”,“19”输入的是4个物品体积

  样例输出:

  5

  “5”是容器大小减掉4个物体不同组合后与容器大小最为接近的一组值(物品组合个数不限制,只找最接近容器大小的值)。

代码:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

v = int(input())n = int(input())lst = []for i in range(n):    lst.append(int(input()))def getSumList(subLst, num):    if num == 1:        return subLst    slen = len(subLst)    if slen == num:        return [sum(subLst)]    tp = []    for i in range(slen):        item = subLst[i]        nxtSubLst = subLst[:i] + subLst[i+1:]        tp.extend([item + nxt for nxt in getSumList(nxtSubLst,num-1)])    return tpminDistance = vfor num in range(1,n+1):    dlst = getSumList(lst,num)    md = min([abs(item-v) for item in dlst])    if md < minDistance:        minDistance = md    for item in dlst:        if item < v:            break    else:        breakprint(minDistance)

解说:

  n个物品,计算1到n各种组合的和与容器的接近程度。这里采用手动组合:比如要组合M个,在列表中按顺序取一个,然后在剩下的列表中,取M-1个,核心代码如下:

· 

· 

· 

· 

for i in range(len(ls)):    item = ls[i]  #取一个    nxtLs = ls[:i]+ls[i+1:]    //从nxtLs递归选M-1

  本题只需组合的和值,因此这个递归函数是这样子的(返回一个列表,因为同样个数的组合可能有多种):

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

def getSumList(subLst, num):    if num == 1:        return subLst    slen = len(subLst)    if slen == num:        return [sum(subLst)]    tp = []    for i in range(slen):        item = subLst[i]        nxtSubLst = subLst[:i] + subLst[i+1:]        tp.extend([item + nxt for nxt in getSumList(nxtSubLst,num-1)])    return tp

  然后,用一个循环,统计最小值:

· 

· 

· 

· 

· 

· 

minDistance = vfor num in range(1,n+1):    dlst = getSumList(lst,num)    md = min([abs(item-v) for item in dlst])    if md < minDistance:        minDistance = md

  循环体内最后的代码是消除空转,因为大组合数的和一定大于小组合数的和(都是正整数):

· 

· 

· 

· 

· 

· 

for num in range(1,n+1):    for item in dlst:        if item < v:              break #当发现有值小于容积,退出内层循环,推进1继续    else:        break  #当没发现有值小于容积,退出外层循环,程序结束

  使用组合模块itertools的combinations函数生成组合,计算每组组合的和即可计算:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

import itertools as tlv = int(input())n = int(input())lst = []for i in range(n):    lst.append(int(input()))
minDistance = vfor num in range(1,n+1):    dlst = [sum(c) for c in tl.combinations(lst,num)]    md = min([abs(item-v) for item in dlst])    if md < minDistance:        minDistance = md    for item in dlst:        if item < v:            break    else:        breakprint(minDistance)