PAT乙级真题(Python3)
程序员文章站
2022-04-06 16:51:27
...
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='')