第十二届蓝桥杯国赛三等奖 大学Python组,部分试题答案

忘了拷贝pdf题目,就把我还记得的题放上来吧!

  • 带宽
    200➗8=25
  • 完全日期
    大月小月不说了,大家都知道;就是当时不知道哪些年的2月份具体有多少天,然后用电脑自带的日历根据从2001查到了2021年,代码直接放下面,结果跑完是 977
wq=0
for year in range(2001,2022):
##    print(year)
    for month in range(1,13):
##        print(str(year)+str(month))
        if month in [1,3,5,7,8,10,12]:
            print(str(year)+"年,"+str(month)+"月,31天")
            for d in range(1,32):
                liebiao = list(str(year)+str(month)+str(d))
                a=0
                for i in liebiao:
                    a+=int(i)
                if a in[4,9,16,25,36,49,64]:
                    print(a)
                    wq+=1
        if month in [4,6,9,11]:
            print(str(year)+"年,"+str(month)+"月,30天")
            for d in range(1,31):
                liebiao = list(str(year)+str(month)+str(d))
                a=0
                for i in liebiao:
                    a+=int(i)
                if a in[4,9,16,25,36,49,64]:
                    print(a)
                    wq+=1
        if month ==2 :
            if year in [2004,2008,2012,2016,2020]:
                print(str(year)+"年,"+str(month)+"月,29天")
                for d in range(1,30):
                    liebiao = list(str(year)+str(month)+str(d))
                    a=0
                    for i in liebiao:
                        a+=int(i)
                    if a in[4,9,16,25,36,49,64]:
                        print(a)
                        wq+=1
            else:
                print(str(year)+"年,"+str(month)+"月,28天")
                for d in range(1,29):
                    liebiao = list(str(year)+str(month)+str(d))
                    a=0
                    for i in liebiao:
                        a+=int(i)
                    if a in[4,9,16,25,36,49,64]:
                        print(a)
                        wq+=1
print(wq)

  • 123
    要求输入一个行数,之后每一行分别是起始计算点和结束计算点。我们只需要根据结束计算点的最大值来构造数列就可以了。在这里实现一行输入两个数字的方法是先整体输入,然后用split切分成一个包含两个值的列表,之后就可以按列表索引分别给起始计算点和技术计算点赋值。代码如下:
asknum = int(input())
qishi=[]
jieshu=[]
quanbu=[]
for i in range(1,asknum+1):
    zong = input().split(" ")
    quanbu.append(int(zong[0]))
    quanbu.append(int(zong[1]))
    qishi.append(int(zong[0]))
    jieshu.append(int(zong[1]))
maxnum = int(max(quanbu))
a =0
cishu=0
for i in range(1,maxnum+1):
    cishu = i
    a+=i
    if a>=maxnum:
        break
shulie = []
for i in range(1,cishu+1):
    for a in range(1,i+1):
        shulie.append(a)
for i in range(asknum):
    sum = 0
    for f in range(int(qishi[i]),int(jieshu[i])+1):
        sum +=shulie[f-1]
    print(sum)
    sum = 0
  • 二进制问题
    具体流程:输一个数字后输出其二进制,强制转换为字符串,替换掉开头的"0b",之后统计1的个数就行啦。代码如下:
zong = input().split()
N=int(zong[0])
K=int(zong[1])
sum = 0
for i in range(1,N+1):
    flag=0
    for a in str(bin(i)).replace('0b',''):
        if a in ['1']:
            flag+=1
    if flag == K:
        sum+=1
print(sum)
  • 和与乘积
    循环遍历就可以了其实,时间紧,具体细节之后再补充,先放代码:
long = int(input())
shulie = input().split(" ")
zong = 0
for i in range(long):
    for a in range(i,long):
        chengji=1
        qiuhe = 0
        for b in range(i,a+1):           
            qiuhe += int(shulie[b])          
            chengji *= int(shulie[b])                    
        if qiuhe == chengji:
            zong+=1
        chengji=1
        qiuhe = 0  
print(zong)

  • 大写
    小写转大写,很简单,用函数对数字和字母进行转换,之后减去大小写字母对应的差就行,代码如下:
s = input()
for i in s:
    if ord(i) >=97 and ord(i) <=122:
        print(chr(int(ord(i))-32),end="")
    else:
        print(i,end="")

总体感觉国赛试题比省赛简单,由于个人编程水平有限,代码仅供参考!

最后证书镇楼哈哈!

你可能感兴趣的