PAT乙级真题(Python3)

A+B和C (15)

题目描述

给定区间[-2的31次方, 2的31次方]内的3个整数A、B和C,请判断A+B是否大于C。

输入描述:

输入第1行给出正整数T(<=10),是测试用例的个数。随后给出T组测试用例,每组占一行,顺序给出A、B和C。整数间以空格分隔。

输出描述:

对每组测试用例,在一行中输出“Case #X: true”如果A+B>C,否则输出“Case #X: false”,其中X是测试用例的编号(从1开始)。

代码如下:

num  = eval(input())
for i in range(num):
    case = input()
    case = case.split(' ')
    if(round(eval(case[0]),1)+round(eval(case[1]),1)>round(eval(case[2]),1)):
        print("Case #{}: true".format(i+1))
    else:
        print("Case #{}: false".format((i+1)))

数字分类 (20)

题目描述

给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:

A1 = 能被5整除的数字中所有偶数的和;
A2 = 将被5除后余1的数字按给出顺序进行交错求和,即计算n1-n2+n3-n4...;
A3 = 被5除后余2的数字的个数;
A4 = 被5除后余3的数字的平均数,精确到小数点后1位;
A5 = 被5除后余4的数字中最大数字。

输入描述:

每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N,随后给出N个不超过1000的待分类的正整数。数字间以空格分隔。

输出描述:

对给定的N个正整数,按题目要求计算A1~A5并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。
若其中某一类数字不存在,则在相应位置输出“N”。

代码如下:

n = input()
nums =  list(map(int,n.split(' ')))
A = [0]*5
t1,t2=0,0
for i in range(1,len(nums)):
    if nums[i]%10==0:
        A[0]+=nums[i]
    elif nums[i]%5==1:
        t1+=1
        if t1%2==0:
            A[1]-=nums[i]
        else:
            A[1]+=nums[i]
    elif nums[i]%5==2:
        A[2]+=1
    elif nums[i]%5==3:
        A[3]+=nums[i]
        t2+=1
    elif nums[i]%5==4:
        if A[4]<nums[i]:
            A[4]=nums[i]
for i in range(5):
    if A[i]==0:
        A[i]='N'
if(A[3]!='N'):
    A[3]=round(A[3]/t2,1)
print("{} {} {} {} {}".format(A[0],A[1],A[2],A[3],A[4]))

福尔摩斯的约会 (20)

题目描述

大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很

 快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面两字符串中第1对相同的大写英文字母(大小写有区分)是

 第4个字母'D',代表星期四;第2对相同的字符是'E',那是第5个英文字母,代表一天里的第14个钟头(于是一天的0点到23点由数字0到9、

 以及大写字母A到N表示);后面两字符串第1对相同的英文字母's'出现在第4个位置(从0开始计数)上,代表第4分钟。现给定两对字符串,

 请帮助福尔摩斯解码得到约会的时间。

输入描述:

输入在4行中分别给出4个非空、不包含空格、且长度不超过60的字符串。

输出描述:

在一行中输出约会的时间,格式为“DAY HH:MM”,其中“DAY”是某星期的3字符缩写,即MON表示星期一,TUE表示星期二,WED表示星期三,THU表示星期
四,FRI表示星期五,SAT表示星期六,SUN表示星期日。题目输入保证每个测试存在唯一解。

代码如下:

item1 = input()
item2 = input()
item3 = input()
item4 = input()
time = []
t = 0
for i in range(len(item1)):
    if item1[i]==item2[i]and (item2[i]>='A'and item2[i]<='Z'):
        t = ord(item2[i])-ord('A')+1
        t%=7
        if t==0:
            time.append("SUN")
        elif t==1:
            time.append("MON")
        elif t==2:
            time.append("TUE")
        elif t==3:
            time.append("WED")
        elif t==4:
            time.append("THU")
        elif t==5:
            time.append("FRI")
        elif t==6:
            time.append("SAT")
        t = i+1
        break
for i in range(t,len(item1)):
    if item1[i]==item2[i]:
        if item1[i]>='0'and item1[i]<='9':
            time.append(str(0)+item1[i])
        elif item1[i]>='A'and item1[i]<='N':
            t = ord(item1[i])-ord('A')+10
            time.append(t)
        break
for i in range(len(item3)):
    if item3[i]==item4[i]and item3[i].isalpha():
        if i>=10:
            time.append(i)
        else:
            time.append(str(0)+str(i))
        break
print("{} {}:{}".format(time[0], time[1], time[2]))

德才论 (25)

题目描述

宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之
小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。”

现给出一批考生的德才分数,请根据司马光的理论给出录取排名。

输入描述:

输入第1行给出3个正整数,分别为:N(<=105),即考生总数;L(>=60),为录取最低分数线,即德分和才分均不低于L的考生才有资格
被考虑录取;H(<100),为优先录取线——德分和才分均不低于此线的被定义为“才德全尽”,此类考生按德才总分从高到低排序;才分不到
但德分到线的一类考生属于“德胜才”,也按总分排序,但排在第一类考生之后;德才分均低于H,但是德分不低于才分的考生属于“才德兼
亡”但尚有“德胜才”者,按总分排序,但排在第二类考生之后;其他达到最低线L的考生也按总分排序,但排在第三类考生之后。

随后N行,每行给出一位考生的信息,包括:准考证号、德分、才分,其中准考证号为8位整数,德才分为区间[0, 100]内的整数。数字间以空格分隔。

输出描述:

输出第1行首先给出达到最低分数线的考生人数M,随后M行,每行按照输入格式输出一位考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人
总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。

代码如下:

def met(ranks):
    return -ranks[1]-ranks[2],-ranks[1],ranks[0]
lt = list(map(int,input().split()))
num = lt[0]
rank1 = []
rank2 = []
rank3 = []
rank4 = []
for i in range(lt[0]):
    ls = list(map(int,input().split()))
    if ls[1]>=lt[2] and ls[2]>=lt[2]:
        rank1.append(ls)
    elif ls[1]>=lt[2] and lt[1]<=ls[2]<lt[2]:
        rank2.append(ls)
    elif ls[1]>=ls[2] and lt[1]<=ls[2]:
        rank3.append(ls)
    elif ls[1]>=lt[1] and ls[2]>=lt[1]:
        rank4.append(ls)
    else:
        num-=1
print(num)
for l in (rank1,rank2,rank3,rank4):
    l.sort(key = met)
    for j in range(len(l)):
        print("{} {} {}".format(l[j][0],l[j][1],l[j][2]))

部分A+B (15)

题目描述

正整数A的“DA(为1位整数)部分”定义为由A中所有DA组成的新整数PA。例如:给定A = 3862767,DA = 6,则A的“6部分”PA是66,因为A中有2个6。
 
 现给定A、DA、B、DB,请编写程序计算PA + PB。

输入描述:

输入在一行中依次给出A、DA、B、DB,中间以空格分隔,其中0 < A, B < 1010。

输出描述:

在一行中输出PA + PB的值。

代码如下:

ls = list(map(str,input().split()))
t1,t2=0,0
for i in range(len(ls[0])):
    if ls[0][i]==ls[1]:
        t1+=1
for i in range(len(ls[2])):
    if ls[2][i]==ls[3]:
        t2+=1
sum=0
for i in range(t1):
    sum+=int(ls[1])*pow(10,i)
for i in range(t2):
    sum+=int(ls[3])*pow(10,i)
print(sum)

A除以B (20)

题目描述

本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

输入描述:

输入在1行中依次给出A和B,中间以1空格分隔。

输出描述:

在1行中依次输出Q和R,中间以1空格分隔。

代码如下:

ls = list(map(str,input().split()))
lt = []
t = 0
lk = []
sum=0
for i in range(len(ls[0])):
    t*=10
    t+=int(ls[0][i])
    if (i+1)%8==0:
        k=t//int(ls[1])
        num = 8-len(str(k))
        if i!=7:
            for j in range(num):
                lt.append('0')
        lt.append(str(k))
        t = t-k*int(ls[1])
        sum = t
k = len(ls[0])%8
ls[0] = ls[0][::-1]
for i in range(k):
    lk.append(ls[0][i])
lk = lk[::-1]
t = sum
for i in range(k):
    t*=10
    t+=int(lk[i])
K = t // int(ls[1])
num = k - len(str(K))
for j in range(num):
    lt.append("0")
lt.append(str(K))
t = t - K * int(ls[1])
for i in range(len(lt)):
    print(lt[i],end='')
print(" {}".format(t))

锤子剪刀布 (20)

题目描述

大家应该都会玩“锤子剪刀布”的游戏:
现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

输入描述:

输入第1行给出正整数N(<=105),即双方交锋的次数。随后N行,每行给出一次交锋的信息,即甲、乙双方同时给出的的手势。C代表“锤子”、J代表“剪刀”、B代
表“布”,第1个字母代表甲方,第2个代表乙方,中间有1个空格。

输出描述:

输出第1、2行分别给出甲、乙的胜、平、负次数,数字间以1个空格分隔。第3行给出两个字母,分别代表甲、乙获胜次数最多的手势,中间有1个空格。如果解不唯
一,则输出按字母序最小的解。

代码如下:

num = eval(input())
ls = []
ResultJ = [0,0,0,0,0,0]
ResultY = [0,0,0,0,0,0]
for i in range(num):
    ls.append(list(map(str,input().split())))
    if ls[i][0]=='J' and ls[i][1]=='C':
        ResultY[0]+=1
        ResultJ[2]+=1
        ResultY[4]+=1
    elif ls[i][0]=='J' and ls[i][1]=='B':
        ResultJ[0]+=1
        ResultY[2]+=1
        ResultJ[5]+=1
    elif ls[i][0]=='C' and ls[i][1]=='B':
        ResultJ[2]+=1
        ResultY[0]+=1
        ResultY[3]+=1
    elif ls[i][0]=='C' and ls[i][1]=='J':
        ResultJ[0]+=1
        ResultY[2]+=1
        ResultJ[4]+=1
    elif ls[i][0]=='B' and ls[i][1]=='C':
        ResultJ[0]+=1
        ResultY[2]+=1
        ResultJ[3]+=1
    elif ls[i][0]=='B' and ls[i][1]=='J':
        ResultJ[2]+=1
        ResultY[0]+=1
        ResultY[5]+=1
    elif (ls[i][0]=='B' and ls[i][1]=='B')or(ls[i][0]=='J' and ls[i][1]=='J')or(ls[i][0]=='C' and ls[i][1]=='C'):
        ResultJ[1]+=1
        ResultY[1]+=1
for i in range(3):
    if i in ([0,1]):
        print(ResultJ[i],end=' ')
    else:
        print(ResultJ[i])
for i in range(3):
    if i in ([0,1]):
        print(ResultY[i],end = ' ')
    else:
        print(ResultY[i])
MaxJ = max(ResultJ[3],ResultJ[4],ResultJ[5])
MaxY = max(ResultY[3],ResultY[4],ResultY[5])
for i in range(3,6):
    if ResultJ[3]==MaxJ:
        print("B ",end='')
        break
    elif ResultJ[4]==MaxJ:
        print("C ",end='')
        break
    else:
        print("J ",end='')
for i in range(3,6):
    if ResultY[3]==MaxY:
        print("B")
        break
    elif ResultY[4]==MaxY:
        print("C")
        break
    else:
        print("J")

个位数统计 (15)

题目描述

给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + d0 (0<=di<=9, i=0,...,k-1, dk-1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定N = 100311,则有2个0,3个1,和1个3。

输入描述:

每个输入包含1个测试用例,即一个不超过1000位的正整数N。

输出描述:

对N中每一种不同的个位数字,以D:M的格式在一行中输出该位数字D及其在N中出现的次数M。要求按D的升序输出。

代码如下:

number = input()
number = str(number)+' '
num = set(number)
num = list(num)
num.sort()
for i in range(1,len(num)):
    print("{}:{}".format(num[i],number.count(num[i])))

D进制的A+B (20)

题目描述

输入两个非负10进制整数A和B(<=230-1),输出A+B的D (1 < D <= 10)进制数。

输入描述:

输入在一行中依次给出3个整数A、B和D。

输出描述:

输出A+B的D进制数。

代码如下:

r = ''
tmp = list(map(int,input().split()))
a = tmp[0]+tmp[1]
d = tmp[2]
while a:
    r+=str(a%d)
    a = a//d
print (r[::-1])

组个最小数 (20)

题目描述

给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:
给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。

现给定数字,请编写程序输出能够组成的最小的数。

输入描述:

每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空
格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。

输出描述:

在一行中输出能够组成的最小的数。

代码如下:

lt = list(map(int,input().split()))
t=0
for i in range(10):
    if i==0:
        continue
    if t==0:
        if lt[i]>0:
            print(i,end='')
            print('0'*lt[0],end='')
            print(str(i)*(lt[i]-1),end='')
            t+=1
    else:
        print(str(i)*lt[i],end='')

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值