蓝桥杯练习题(四):Python组之历届试题三十题

简介: 关于蓝桥杯Python组历届试题的三十个练习题的总结,包括题目描述、输入输出格式、样例输入输出以及部分题目的解题思路和代码实现。

1.小数第n位

  • 问题描述:我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式.本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始的3位数。
  • 输入格式:一行三个整数:a b n,用空格分开。a是被除数,b是除数,n是所求的小数后位置(0<a,b,n<1000000000)
  • 输出格式:一行3位数字,表示:a除以b,小数后第n位开始的3位数字。
  • 样例输入:1 8 1
  • 样例输出:125
  • 样例输入:1 8 3
  • 样例输出:500
  • 样例输入:282866 999000 6
  • 样例输出:914

具体代码😦)

# 与>>类似“<< 左移” 左移一位表示乘2,二位就表示4,就是2的n次方 “>> 右移,高位补符号位” 这里右移一位表示除2“>>> 无符号右移,高位补0”;
def quickmi(a,n):
    res=1
    while n:
        if n%2!=0:
            res*=a%mod
        a*=a%mod
        n>>=1
    return res%mod

a, b, n = map(int, input().split())
mod=b*1000
c=a/b
# print(c)
c=int(c*quickmi(10,n+2))
x=c%1000
print(x)

运行结果:
在这里插入图片描述

2.Excel地址

  • 问题描述:Excel单元格的地址表示很有趣,它使用字母来表示列号。
      比如,
      A表示第1列,
      B表示第2列,
      Z表示第26列,
      AA表示第27列,
      AB表示第28列,
      BA表示第53列,
      …
      当然Excel的最大列号是有限度的,所以转换起来不难。
      如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列呢?
      本题目即是要求对输入的数字, 输出其对应的Excel地址表示方式。
  • 样例输入:26
  • 样例输出:Z
  • 样例输入:27
  • 样例输出:AA
  • 样例输入:2054
  • 样例输出:BZZ

具体代码😦)

n=int(input())
a=[]
while n:
    if n%26==0:
        a.append(26)
        n=n//26-1
    else:
        a.append(n%26)
        n=n//26
for i in range(len(a)):
    print(chr(a[len(a)-1-i]+64),end='')

运行结果:
在这里插入图片描述

3.对局匹配

  • 问题描述:小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分,代表他的围棋水平。
      小明发现网站的自动对局系统在匹配对手时,只会将积分差恰好是K的两名用户匹配在一起。如果两人分差小于或大于K,系统都不会将他们匹配。
      现在小明知道这个网站总共有N名用户,以及他们的积分分别是A1, A2, … AN。
      小明想了解最多可能有多少名用户同时在线寻找对手,但是系统却一场对局都匹配不起来(任意两名用户积分差不等于K)?
  • 输入格式 :第一行包含两个个整数N和K。   第二行包含N个整数A1, A2, … AN,对于30%的数据,1 <= N <= 10   对于100%的数据,1 <= N <= 100000, 0 <= Ai <= 100000, 0 <= K <= 100000
  • 输出格式 :一个整数,代表答案。
  • 样例输入:
    10 0
    1 4 2 8 5 7 1 4 2 8
  • 样例输出:6

具体代码😦)

n,m=list(map(int,input().split()))
arr=list(map(int,input().split()))
cout=0
for i in range(0,len(arr)):
    for j in range(i+1,len(arr)):
        if arr[i]-arr[j]==m:
            cout+=1
        else:
            continue
# print(arr)
print(n-cout)

运行结果:
在这里插入图片描述

4.k倍区间

  • 问题描述:给定一个长度为N的数列,A1, A2, … AN,如果其中一段连续的子序列Ai, Ai+1, … Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。
      你能求出数列中总共有多少个K倍区间吗?
  • 输入格式 :第一行包含两个整数N和K。(1 <= N, K <= 100000)以下N行每行包含一个整数Ai。(1 <= Ai <= 100000)
  • 输出格式 :输出一个整数,代表K倍区间的数目。
  • 样例输入:
    5 2
    1
    2
    3
    4
    5
  • 样例输出:6

具体代码:(但是只通过两个,28分)


n,m=list(map(int,input().split()))
a=[]
b=[0]
cout=0
for i in range(n):
    a.append(int(input()))
    b.append(sum(a))
# print(a)
# print(b)
for i in range(1,n+1):
    for j in range(i,n+1):
        if (b[j]-b[i-1])%m==0:
            cout+=1
print(cout)

运行结果:
在这里插入图片描述

5.小朋友排队

  • 问题描述:n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。
      每个小朋友都有一个不高兴的程度。开始的时候,所有小朋友的不高兴程度都是0。
      如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加2(即不高兴程度为3),依次类推。当要求某个小朋友第k次交换时,他的不高兴程度增加k。
      请问,要让所有小朋友按从低到高排队,他们的不高兴程度之和最小是多少。
      如果有两个小朋友身高一样,则他们谁站在谁前面是没有关系的。
  • 输入格式 :输入的第一行包含一个整数n,表示小朋友的个数。第二行包含 n 个整数 H1 H2 … Hn,分别表示每个小朋友的身高。
  • 输出格式 :输出一行,包含一个整数,表示小朋友的不高兴程度和的最小值。
  • 样例输入:
    3
    3 2 1
  • 样例输出:9

具体代码:(但是只通过两个,其它的全部超时,只有20分)

  • 解题思想:先创建一个3行N列的矩阵,第一行就是输入的我们输入的数,第二行是根据输入的数的个数创建相同个数的0,用来表示每个小朋友不高兴程度的累积,一开始为0,第三行就是与n相同个数的1,用来表示他们一开始不高兴程度的增加的初始值,后面随着两两交换,这两个数对应的第三行各自加到第二行,并且第三行自动加1,表示下一次当前小朋友移动的话会多一个值增加,并且这两个小朋友所在的第一行第二行第三行也要互相交换位置,最后我们得到的第二行就是每个小朋友的不高兴程度的值,通过迭代加起来即可,但是这种解法虽然可以通过,却只有两个正确得到20分,其它的全部超时,说明思路是没问题的,代码还需要改进。

def m_swap(a,b):
    t=int(b)
    b=int(a)
    a=t
    return a,b

def change(list):
    result = []
    for i in range(n):
        result.append(re_list[0][i])
    return result

n=int(input())
arr=list(map(int,input().split()))
arr_i=arr[:]
arr_i.sort()
arr1=[0 for i in range(n)]
arr2=[1 for i in range(n)]
list=arr+arr1+arr2
re_list=[arr,arr1,arr2]
# for i in re_list:
#     for j in range(n):
#         print(i[j],end=' ')
#     print()
# print('****************************begin**********************************')
for k in re_list:
    for j in range(0,n-1):
        if k==re_list[0]:
            if k[j]>k[j+1]:
                re_list[1][j]+=re_list[2][j]
                re_list[1][j+1]+=re_list[2][j+1]
                re_list[2][j]+=1
                re_list[2][j+1]+=1
                re_list[0][j],re_list[0][j+1]=m_swap(int(re_list[0][j]),int(re_list[0][j+1]))
                re_list[1][j], re_list[1][j + 1] =m_swap(int(re_list[1][j]),int(re_list[1][j + 1]))
                re_list[2][j], re_list[2][j + 1] =m_swap(int(re_list[2][j]),int(re_list[2][j + 1]))
                # 每次换位置之后数组显示
                # for i in re_list:
                #     for j in range(n):
                #         print(i[j], end=' ')
                #     print()
                # print("****************************************************************")
                result=change(re_list[0])
                # print(result)
                while result!=arr_i:
                    for k in re_list:
                        for j in range(0, n - 1):
                            if k == re_list[0]:
                                if k[j] > k[j + 1]:
                                    re_list[1][j] += re_list[2][j]
                                    re_list[1][j + 1] += re_list[2][j + 1]
                                    re_list[2][j] += 1
                                    re_list[2][j + 1] += 1
                                    re_list[0][j], re_list[0][j + 1] = m_swap(int(re_list[0][j]),
                                                                              int(re_list[0][j + 1]))
                                    re_list[1][j], re_list[1][j + 1] = m_swap(int(re_list[1][j]),
                                                                              int(re_list[1][j + 1]))
                                    re_list[2][j], re_list[2][j + 1] = m_swap(int(re_list[2][j]),
                                                                              int(re_list[2][j + 1]))
                                    # 每次换位置之后数组显示
                                    # for i in re_list:
                                    #     for j in range(n):
                                    #         print(i[j], end=' ')
                                    #     print()
                                    # print("****************************************************************")
                                    result = change(re_list[0])
sum=0
for i in range(n):
    sum+=re_list[1][i]
print(sum)

运行结果:
在这里插入图片描述

6.单词分析

  • 问题描述:小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。

现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这个字母出现的次数。

  • 输入格式 :输入一行包含一个单词,单词只由小写英文字母组成。
  • 输出格式 :输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪个。如果有多个字母出现的次数相等,输出字典序最小的那个。

第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。

  • 样例输入:lanqiao
  • 样例输出:
    a
    2

具体代码:

from collections import Counter
n=input()
arr=[]
for i in range(len(n)):
    arr.append(n[i])
# print(arr)
a=Counter(arr)
# print(a)
b=a.most_common(3)
# print(b)
for i in range(len(b)-1):
    if b[i][1]==b[i+1][1]:
        if b[i][0]>b[i+1][0]:
            print(b[i+1][0])
            print(b[i+1][1])
            break
    else:
        # print(b[i][0])
        # print(b[i][1])
        print(a.most_common(1)[0][0])
        print(a.most_common(1)[0][1])
        break

运行结果
在这里插入图片描述

7.成绩分析

  • 问题描述:
    小蓝给学生们组织了一场考试,卷面总分为 100分,每个学生的得分都是一个 0到100的整数。请计算这次考试的最高分、最低分和平均分。
  • 输入格式 :输入的第一行包含一个整数 ,表示考试人数。
    接下来 n行,每行包含一个 0至100的整数,表示一个学生的得分。
  • 输出格式 :
    输出三行。
    第一行包含一个整数,表示最高分。
    第二行包含一个整数,表示最低分。
    第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。
  • 样例输入:
    7
    80
    92
    56
    74
    88
    99
    10
  • 样例输出:
    99
    10
    71.29

具体代码:

def avg(list,sum):
    return sum/len(list)
n=int(input())
arr=[]
for i in range(n):
    arr.append(int(input()))
# print(arr)
sum=sum(arr)
print(max(arr))
print(min(arr))
print('%.2f'%avg(arr,sum))

运行结果
在这里插入图片描述

8.成绩统计

  • 问题描述:
    小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0到100的整数。
    如果得分至少是60分,则称为及格。如果得分至少为85分,则称为优秀。
    请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。
  • 输入格式 :输入的第一行包含一个整数 ,n表示考试人数。
    接下来 n行,每行包含一个0至100的整数,表示一个学生的得分。
  • 输出格式 :输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分四舍五入保留整数。
  • 样例输入:
    7
    80
    92
    56
    74
    88
    100
    0
  • 样例输出:
    71%
    43%

具体代码:

def cout(arr):
    sum_excellent=0
    sum_fail=0
    for i in range(n):
        if arr[i]<60 :
            sum_fail+=1
        if arr[i]>=85:
            sum_excellent+=1
    return sum_fail,sum_excellent

if __name__ == '__main__':
    import math
    n=int(input())
    arr=[]
    for i in range(n):
        arr.append(int(input()))
    a,b=cout(arr)
    # print(int((1-a/n)*100),'%',sep='')
    # print(int((b/n)*100),'%',sep='')
    # Math.floor(x) // 返回小于x的最大整数 Math.ceil(x) // 返回大于x的最小整数 Math.round()   返回四舍五入后的整数
    print('{}%'.format(round((1-a/n)*100)))
    print('{}%'.format(round((b/n) * 100)))

运行结果
![在这

9.回文日期

  • 问题描述:

  • 输入格式
    在这里插入图片描述

  • 输出格式 :在这里插入图片描述

  • 样例输入:20200202

  • 样例输出:
    20211202
    21211212

具体代码:

def is_hui(x):
    x=str(x)
    if x==x[::-1]:
        return True
    else:
        return False
def is_run(x):
    if (x%4==0 and x%100!=0) or x%400==0:
        return True
    else:
        return False
def is_AB(x):
    x=str(x)
    if (x[0]==x[2]==x[5]==x[7]) and (x[1]==x[3]==x[4]==x[6]):
        return True
    else:
        return False

n=input()
year=int(n[0:4])
month=int(n[4:6])
day=int(n[6:])
# print(year,month,day)
i=1
flag=True
result=[]
result1=[]
while flag:
    day+=1
    if day==32 and month==12: # 年份+1的情况
        month=1
        day=1
        year+=1
        # print(year,month,day)
    if (day==32 and (month==1 or month==3 or month==5 or month==7 or month==8 or month==10)): # 奇数月+1的情况
        day=1
        month+=1
    if (day==31 and (month==4 or month==6 or month==9 or month==11)): # 偶数月+1的情况
        day=1
        month+=1
    if (day==30 and month==2 and is_run(year)): # 是闰年2月的情况
        day=1
        month+=1
    if (day==29 and month==2 and is_run(year)!=True): # 不是闰年2月的情况
        day=1
        month+=1
    # if month==0:
    #     month+=1
    num=year*10000+month*100+day
    if is_hui(num):
        result.append(num)
        if is_AB(num):
            result1.append(num)
            break

    # print(i)
# print(result)
print(result[0])
print(result1[0])

运行结果:
在这里插入图片描述

10.数字三角形

  • 问题描述:
    在这里插入图片描述

  • 输入格式
    在这里插入图片描述

  • 输出格式 :输出一个整数,表示答案。

  • 样例输入:
    5
    7
    3 8
    8 1 0
    2 7 4 4
    4 5 2 6 5

  • 样例输出:27

具体代码:

def DigitalTriangle():
    import copy
    n = int(input())
    arrs=[]
    for i in range(n):
        arrs.append(list(map(int,input().split())))

    temp_list = copy.deepcopy(arrs)  # 这里的temp_list实际存储的是左下和右下路径长度
    # print(temp_list)
    for i in range(1, n):
        for j in range(i):
            # print(i,'****',j)
            temp_list[i][j]=max(temp_list[i-1][j],temp_list[i-1][j-1])+arrs[i][j]
            #print(temp_list)
    if n%2==1:
        print(temp_list[n-1][int(n/2)])
    else:
        if temp_list[n-1][n//2] > temp_list[n-1][n//2-1]:
            print(temp_list[n-1][n//2])
        else:
            print(temp_list[n - 1][n // 2]-1)

DigitalTriangle()

运行结果:
在这里插入图片描述

11.回文数字

  • 问题描述:
    在这里插入图片描述
  • 输入格式在这里插入图片描述
  • 输出格式 :输出一个整数,表示答案。
  • 样例输入:44
  • 样例输出:
    99899
    499994
    589985
    598895
    679976
    688886
    697796
    769967
    778877
    787787
    796697
    859958
    868868
    877778
    886688
    895598
    949949
    958859
    967769
    976679
    985589
    994499

具体代码:

def is_hui(x):
    x=str(x)
    if x==x[::-1]:
        return True
    else:
        return False
def sum_hui(x):
    x=str(x)
    sum=0
    for i in range(len(x)):
        sum+=int(x[i])
        # print(sum)
    return sum
n=int(input())
if n>54: # t通过上面的sum可以看到最大的n为54
    print(-1)
else:
    for i in range(10000,1000000):
        if is_hui(i):
            if sum_hui(i)==n:
                print(i)

运行结果:
在这里插入图片描述

12.日期问题

  • 问题描述:在这里插入图片描述
  • 输入格式 :一个日期,格式是"AA/BB/CC"。 (0 <= A, B, C <= 9)
  • 输出格式 :输出若干个不相同的日期,每个日期一行,格式是"yyyy-MM-dd"。多个日期按从早到晚排列。
  • 样例输入:02/03/04
  • 样例输出:
    2002-03-04
    2004-02-03
    2004-03-02

具体代码:

def is_run(x):
    if (x%4==0 and x%100!=0) or x%400==0:
        return True
    else:
        return False
def default(x,y,z):
    # 这些日期都在1960年1月1日至2059年12月31日。
    if x>=0 and x<=59:
        x+=2000
    elif x>=60 and x<=99:
        x+=1900
    # 月份小于0或者大于12的排除
    if y<=0 or y>12:
        return False
    # 天数小于0或者大于31的排除
    if z<=0 or z>31:
        return False
    if is_run(x) and y==2 and z>29: # 闰年2月为29天
        return False
    if is_run(x)==False and y==2 and z>28: # 闰年2月为28天
        return False
    if (y==4 or y==6 or y==9 or y==11) and z>30:
        return False
    if (y==1 or y==3 or y==5 or y==7 or y==8 or y==12) and z>31:
        return False
    else:
        if y<10:
            y=str(0)+str(y)
        if z<10:
            z=str(0)+str(z)
        arr.append(str(x) + '-' + str(y) + '-' + str(z))
        return

n=input()
year=int(n[0:2])
month=int(n[3:5])
day=int(n[6:9])

arr=[]
x11,y11,z11=0,0,0
x21,y21,z21=0,0,0
x31,y31,z31=0,0,0
if year==4:
    default(year,month,day)
    default(day,month,year)
    default(day,year,month)

    # set 有去重复的功能
    """
    aa = [1,2,2,3,3,2,7,8,9]
    print(len(set(aa)))
    """
    for i in range(len(set(arr))):
        print(arr[i])
else:
    default(day, month, year)
    default(year, month, day)
    default(day, year, month)
    for i in range(len(set(arr))):
        print(arr[i])

运行结果:
在这里插入图片描述

目录
相关文章
|
1天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1517 4
|
28天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
5天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
481 17
|
1天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
179 1
|
8天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
21天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
8天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
442 4
|
7天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
313 2
|
23天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
25天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2607 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析