第十二届蓝桥杯青少组Python国赛真题解

单选题1: s ='Hi LanQiao',运行以下哪个选项代码可以输出“LanQiao”子串( )。
A)print(s[-7:])  (B)print(s[-6:-1])  (C) print(s[-7:0])  (D)print(s[-7:-1])答案:A  

提示:倒数第一个是-1,但倒数第0个不是0,因为0是第1个。

单选题2:已知 a = 2021.0529,运行以下哪个选项代码可以输出“2021.05”( )。(A)print('{.2f}'.format(a))  (B)print('{:.2f}'.format(a))  (C)print('{.2}'.format(a))  (D)print('{:.2}'.format(a))答案:B  

提示:格式字符串冒号“:”前是参数序号,从0开始,0可以省略。

单选题3:已知 pi=3.1415926,运行 print(round(pi),round(pi,2))语句,输出的结果是( )。(A) 3 3.14   (B)2 4   (C) 3 6.18  (D)3.14 3

答案:A

单选题4:运行以下程序,输出的结果是( )。d = {'Beijing':'China', 'Washington':'America', 'Ottawa':'Canadian'}print(max(d),min(d)) (A)Washington Ottawa   (B)Canadian China   (C)America China   (D)Washington Beijin答案:D   

提示:直接迭代字典,迭代的是字典的键。

单选题5:如果 p = ord('b'), 运行 print(p,chr((p+3)%26+p))语句,输出的结果是( )。(A) 66 D  (B)66 S   (C)98 y   (D) 98 e答案:C  

提示:'a'==97  'A' ==65,则ord('b')==98。 

编程题1:  给定 N 个数字(包含整数和小数),找到 N 个数中最大的数字。

输入描述:输入N个数字(N>2),且N个数字之间以英文逗号隔开 

输出描述:输出N个数字中最大的数字 样例输入:4,8,2 样例输出:8代码

· 

· 

lst=map(float, input().split(','))print(max(lst))

编程题2

  提示信息:  质数:是一个大于 1 的自然数,且除了 1 和它本身外,不能被其他自然数整除的数。最小的质数是 2,1 不是质数。   合数:一个正整数,如果除 1 和它本身以外,还能被其他正整数整除,叫合数。如 6 是合数,除了 1 和 6 以外,还能被 2 和 3 整除。  分解质因数:每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数(分解质因数只针对合数)。如合数 12=2×2×3 。   分解质因数的方法是先用这个合数的最小质因数去除这个合数,结果若是一个质数就不再除下去;若是 一个合数就继续按原来的方法从最小质因数除起,直至最后除得的结果是一个质数   例如:   合数 18 分解质因数,首先用最小质因数 2 去除,除后结果为合数 9,继续用最小质因数 3 去除,除后结 果为质数 3,就不再除下去。所以 18 的质因数为 2、3、3,故质因数的个数为3:

  编程实现: 

  给定一个合数N,将N分解质因数后,输出其质因数个数。   输入描述:输入一个合数  输出描述:N分解质因数后,输出质因数个数   样例输入:18   样例输出:3代码

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

N = int(input())zslst = [] #质数表count = 0  #个数统计sh = N  #商for i in range(2,N//2+1):    for j in zslst:        if i % j == 0:            break  #不是质数,不执行else块    else:        zslst.append(i)        while sh % i == 0:  #分解质因数            sh //= i            count+=1        if sh == 1:            break
print(count)

解说:  给定一个合数N,它的最小质因数不小于2,它的最大质因数不大于N//2。如果采用暴力法,无法保证所得因数是否是质数,因此需要对因数进行筛选。  本处采用“质数筛”方法:在空质数列表中加入2,剔除所有2的倍数,然后加入下一个剩下的数,同样剔除所有的倍数,如此类推。  采用“质数筛”方法编程并不需要严格按“质数筛”方法操作。我们只需按顺序检查数字是否是质数表中某个质数的倍数,就可以断定这个数是合数,否则是质数;当遇到一个质数时,先把这个质数放入质数表中,然后再从下一个数开始检查。程序中的质数筛代码部分如下:

· 

· 

· 

· 

· 

· 

· 

zslst = [] #质数表for i in range(2,N//2+1):    for j in zslst:        if i % j == 0:            break  #不是质数,不执行else块    else:        zslst.append(i)

  完成质数表后,就可以进行质因数分解,代码如下:

· 

· 

· 

· 

· 

· 

· 

· 

count = 0  #个数统计sh = N  #商for i in zslst:    while sh % i == 0:  #分解质因数        sh //= i        count+=1    if sh == 1:        break

  本文把两部分代码柔合在一起,减少不必要的运算。

编程题3:  给定一个含有字母和数字的字符串,输出此字符串中最长的数字子串的长度。   如:字符串“a2a22d”,最长的数字子串为22,长度为2,故输出2;字符串“lq12h567j765”,最长的数字子串为567和765,长度都为3,故输出3。  输入描述:输入一个含有字母和数字的字符串(5<字符串长度<101)   输出描述:输出此字符串中最长的数字子串的长度   样例输入:a2a22d   样例输出:2代码

· 

· 

· 

· 

· 

s = input()import repattern = re.compile(r'\d+')result = pattern.findall(s)print(len(max(result,key=lambda x : len(x))))

解说:  本处采用正则表达式模块re。先编译r'\d+'正则表达式,然后用findall方法可以得到符合要求的子字符串列表,打印出长度最大的字符串的长度。
  如果不使用正则表达式,建一个数字列表,检查字符串中最长的连续数字即可,代码如下:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

s = input()digits = ['0','1','2','3','4','5','6','7','8','9']maxCount = 0count = 0start = Falsefor i in range(len(s)):    if digits.count(s[i]) > 0:        count += 1        if not start:            start = True    else:        if start:            start = False            if count > maxCount:                maxCount = count               count = 0                       print(maxCount)        

编程题4

  提示信息:   质数:是一个大于 1 的自然数,且除了 1 和它本身外,不能被其他自然数整除的数。最小的质数是 2,1 不是质数。   大于 2 的偶数有一个特点,任意一个大于 2 的偶数可以由一对质数相加得到,但有的偶数不止有一对这样的质数对。   如偶数 6,有一对质数相加得 6,为(3,3)   如偶数 14,有两对质数相加得 14,分别是(3,11),(7,7)   编程实现:   给定一个大于2的偶数,在所有满足“任意一个大于2的偶数可以由两个质数相加得到”这个特点的质数 对中,找出两个质数差值最小的一对,并将差值输出(差值为大数减小数的值,两个质数相等时差值为 0)。   例如:偶数16,满足特点的质数对有(5,11)和(3,13),差值最小的一对是(5,11),11减5,差值 为6。  输入描述:输入一个大于2的偶数N   输出描述:输出满足“任意一个大于2的偶数可以由两个质数相加得到”这个特点的所有质数对中,差值最小的那一对的差值   样例输入:16   样例输出:6代码

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

N = int(input())zslst = [] #质数表for i in range(2,N-1):    for j in zslst:        if i % j == 0:            break  #不是质数,不执行else块    else:        zslst.append(i)
rst = N  #结果for zs in zslst:    c = N - zs    if zslst.count(c)>0:        tmp = abs(N-2*zs)        if tmp < rst:            rst = tmp
print(rst)

解说:用质数筛的方法建立2N-1的质数表,然后从质数表中选取一对质数使它们的和等于N,计算它们的差值。

编程题5

  编程实现:   孙悟空的金箍棒可以变高也可以变矮还可以变出多个金箍棒。   这天孙悟空无聊变出了N个长短不一金箍棒,这些金箍棒之间相互吵闹,攀比谁高。当孙悟空每次手指其中一个金箍棒时,这个金箍棒高度不变,其他的金箍棒高度都会增加1。只有当所有金箍棒高度都一样时, 他们之间才不相互吵闹,也不会再增加高度,保持静止。
  分别给定N个金箍棒的初始高度,请你帮助孙悟空计算一下至少手指几次可以让N个金箍棒高度都一样。  例如: 有3个金箍棒,初始高度分别为2,3,4。  第一次手指第三个金箍棒,第三个金箍棒高度不变,第一和第二个金箍棒高度分别增加1,变为3,4,4;  第二次手指第二个金箍棒,第二个金箍棒高度不变,第一和第三个金箍棒高度分别增加1,变为4,4,5;  第三次手指第三个金箍棒,第三个金箍棒高度不变,第一和第二个金箍棒高度分别增加1,变为5,5,5;  这时3个金箍棒的高度都为5,手指3次后金箍棒高度一样。所以至少手指3次才能使金箍棒高度都一样。 

  输入描述:

  输入N个非全部相等的正整数(2<N<31),且之间以英文逗号隔开,分别表示N个金箍棒的初始高度  输出描述:输出一个正整数,表示至少手指几次才能使金箍棒高度都一样  样例输入:2,3,4  样例输出:3代码

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

lst = list(map(int, input().split(',')))#最无奈的策略,每次点一个最大值,别无他法N = len(lst)count = 0m = max(lst)while lst.count(m)<N:    keep = True    for i in range(N):        if keep and lst[i] == m:            keep = False            count+=1        else:            lst[i] += 1    m = max(lst)
print(count)

解说:如果不是点最大值,那么被点的和最大值距离拉大,没被点的距离不变,显然不但没有拉近距离,反而距离增大了,所有每次被点必定是一个最大值,当所有的元素都是最大值时结束。

编程题6

  编程实现:   六月一日是国际儿童节,小蓝的学校为迎接儿童节要在学校的一块正方形空地上使用不同颜色的花卉摆放图案。   为了摆放的更精准,图案更漂亮,小蓝把这块正方形空地同比例缩小将其画在纸上,并平分成100*100的 方格,每个方格的坐标点为,(1,1)...... (100,100),如下图:    首先在指定坐标的方格内放置红色的花卉(每个方格放一盆),完成后,找出最多有多少盆红色花卉在同一条直线上。(同一直线包含同一列、同一行、同一对角线,红色花卉可以连续也可以不连续)  如:指定的坐标(2,1)、(3,2)、(5,2)、(4,3)、(3,4)、(6,5)的方格内放置红色的花卉,其中最多的红色花卉在同一条直线上的坐标点为(2,1)、(3,2)、(4,3)、(6,5),故最多有4盆红色的花卉在同一条直线上。    输入描述:输入n对正整数,每一对正整数之间以一个空格隔开,代表放置红色花卉的方格位置。每对正 整数中的两个数字以英文逗号隔开   输出描述:输出最多有多少盆红色花卉在同一条直线上   样例输入:2,1 3,2 5,2 4,3 3,4 6,5   样例输出:4代码

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

lst = [tuple(map(int,x.split(','))) for x in input().split()]
#创建斜线主键def createRcks(it):    return it[1]-it[0]+1, it[1]+it[0]-1
#求最长列表的长度def maxLen(items):    return len(max(items, key=lambda x : len(x)))
#按行列斜行分类rows = {}cols = {}rcs1 = {}rcs2 = {}for it in lst:    if it[0] in rows:        r = rows[it[0]]    else:        r = []        rows[it[0]] = r    r.append(it)    if it[1] in cols:        c = cols[it[1]]    else:        c = []        cols[it[1]] = c    c.append(it)    rck1,rck2 = createRcks(it)    if rck1 in rcs1:        rc1 = rcs1[rck1]    else:        rc1 = []        rcs1[rck1] = rc1    rc1.append(it)    if rck2 in rcs2:        rc2 = rcs2[rck2]    else:        rc2 = []        rcs2[rck2] = rc2    rc2.append(it)
print(max(maxLen(rows.values()),maxLen(cols.values()),maxLen(rcs1.values()),maxLen(rcs2.values())))

解说:把每一点都分配到行、列、正斜线和反斜线四个字典中,每一键对应于一个列表,求出所有这些列表的最长长度。斜线的主键使用x坐标是1时的y坐标值(可能是负值)。