刷题日记?刷题日寄!
萌新备战蓝桥杯python组
发现有需要纠正的地方,烦请指正!
欢迎小伙伴们的三连+关注!
往期系列:
【蓝桥杯简单篇】Python组刷题日寄Part01
【蓝桥杯简单篇】Python组刷题日寄Part02
简单篇03
题目:
时间限制:
1s
内存限制:
128MB
题目描述:
小强从小就喜欢生命科学,他总是好奇花草鸟兽从哪里来的。终于, 小强上中学了,接触到了神圣的名词–DNA.它有一个双螺旋的结构。这让一根筋的小强抓破头皮,“要是能画出来就好了” 小强喊道。现在就请你帮助他吧
输入描述:
输入包含多组测试数据。第一个整数N(N<=15),N表示组数,每组数据包含两个整数a,b。a表示一个单位的DNA串的行数,a为奇数且 3<=a<=39。b表示重复度(1<=b<=20)。
输出描述:
输出DNA的形状,每组输出间有一空行。
样例输入:
2
3 1
5 4
样例输出:
X X
X
X X
X X
X X
X
X X
X X
X X
X
X X
X X
X X
X
X X
X X
X X
X
X X
X X
答案:
分析:
对于一个单位的dna串,我们可以先打印其a-1行,重复b-1次,最后打印最后一行
def dna(a):
# 先创建 (a-1)*a 的二维列表,元素都为 空格' '
lis = [[' ' for i in range(a)] for j in range(a-1)]
# 在对应位置赋值'X'
for i in range(a-1):
lis[i][i] = 'X'
lis[i][a-1-i] = 'X'
# 打印
for j in lis:
print(''.join(j))
n = int(input())
A, B = [], []
for i in range(n):
a, b = map(int, input().split())
A.append(a)
B.append(b)
for i in range(n):
a = A[i]
b = B[i]
for j in range(b):
dna(a)
print('X' + ' '*(a-2) + 'X\n')
题目:
时间限制:
1s
内存限制:
128MB
题目描述:
Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它们从0开始编号,到几百万,几千万,甚至上亿。
比如说,在对学生讲解第1234567009号位置上的碱基时,光看着数字是很难准确的念出来的。
所以,他迫切地需要一个系统,然后当他输入12 3456 7009时,会给出相应的念法:
十二亿三千四百五十六万七千零九
用汉语拼音表示为:
shi er yi san qian si bai wu shi liu wan qi qian ling jiu
这样他只需要照着念就可以了。
你的任务是帮他设计这样一个系统:给定一个阿拉伯数字串,你帮他按照中文读写的规范转为汉语拼音字串,相邻的两个音节用一个空格符格开。
注意必须严格按照规范,比如说“10010”读作“yi wan ling yi shi”而不是“yi wan ling shi”,“100000”读作“shi wan”而不是“yi shi wan”,“2000”读作“er qian”而不是“liang qian”。
输入描述:
有一个数字串,数值大小不超过2,000,000,000。
输出描述:
是一个由小写英文字母,逗号和空格组成的字符串,表示该数的英文读法。
样例输入:
1234567009
样例输出:
shi er yi san qian si bai wu shi liu wan qi qian ling jiu
答案:
分析:
见注释
d = {'1':'yi', '2':'er', '3':'san', '4':'si', '5':'wu',
'6':'liu', '7':'qi', '8':'ba', '9':'jiu', '0':'ling'}
n = input().strip()
a = []
b = []
# 定义函数,读四位数的拼音
def exchange(n):
# 先将数字逆序
# b用来存储读法的逆序
n = n[::-1]
for i in range(len(n)):
# 对于第一个(对应原数字最后一个)
if i==0:
# 不为0,则正常读
if n[i]!='0':
b.append(d[n[i]])
# 对于第二个(对应原数字倒数第二个)
elif i==1:
# 为0,且前一个不为0
if n[i]=='0' and n[0]!='0':
# 读 'ling'
b.append(d['0'])
# 为1,且只有两位,则读 十('shi')
elif n[i]=='1' and len(n)==2:
b.append('shi')
# 不为0,读 几十('shi')
elif n[i]!='0':
b.append('shi')
b.append(d[n[i]])
# 对于第三个数(对应原数字的第二个数)
elif i==2:
# 为0,且前一个不为0
if n[i]=='0' and n[1]!='0':
# 读 零('ling')
b.append(d['0'])
# 不为0,读 几百('bai')
elif n[i]!='0':
b.append('bai')
b.append(d[n[i]])
# 对于第四个数(对应原数字的第一个数)
elif i==3:
# 为0,且前一个不为0
if n[i]=='0' and n[2]!='0':
# 读 零('ling')
b.append(d['0'])
# 不为0,读 几千('qian')
elif n[i]!='0':
b.append('qian')
b.append(d[n[i]])
while n!='':
# 不为空
# 四位及以上
# 最终得到一个列表a,是从个位开始,每四位截取为一个元素
if len(n)>=4:
s = n[-4:] # 取出后四位
n = n[:-4] # 删除后四位
a.append(s) # 将后四位写入列表a
else:
a.append(n)
n = ''
for i in range(len(a)):
if i==0:
# 对于:个、十、百、千位
exchange(a[i])
elif i==1:
# 对于:万、十万、百万、千万位
b.append('wan')
exchange(a[i])
elif i==2:
# 对于:亿、十亿、百亿、千亿位
b.append('yi')
exchange(a[i])
for i in range(len(b)-1, -1, -1):
# 将列表b逆序输出即可
# 元素之间要空格
if i==len(b)-1:
print(b[i], end='')
else:
print(' %s' % b[i], end='')
题目:
时间限制:
1s
内存限制:
128MB
题目描述:
正整数的各位数字之和被Tom称为Tom数。求输入数(<2^32)的Tom数!
输入描述:
每行一个整数(<2^32)。
输出描述:
每行一个输出,对应该数的各位数之和。
样例输入:
12345
56123
82
样例输出:
15
17
10
答案:
分析:
无
while True:
try:
x = input()
print(sum([int(i) for i in x]))
except:
break
题目:
时间限制:
1s
内存限制:
128MB
题目描述:
某涉密单位下发了某种票据,并要在年终全部收回。
每张票据有唯一的ID号。全年所有票据的ID号是连续的,但ID的开始数码是随机选定的。
因为工作人员疏忽,在录入ID号的时候发生了一处错误,造成了某个ID断号,另外一个ID重号。
你的任务是通过编程,找出断号的ID和重号的ID。
假设断号不可能发生在最大和最小号。
输入描述:
要求程序首先输入一个整数N(N< 100)表示后面数据行数。
接着读入N行数据。
每行数据长度不等,是用空格分开的若干个(不大于100个)正整数(不大于100000),请注意行内和行末可能有多余的空格,你的程序需要能处理这些空格。
每个整数代表一个ID号。
输出描述:
要求程序输出1行,含两个整数m n,用空格分隔。
其中,m表示断号ID,n表示重号ID
样例输入:
2
5 6 8 11 9
10 12 9
样例输出:
7 9
答案:
分析:
sort()
函数,remove()
函数
N = int(input())
L = []
for i in range(N):
lis = list(map(int, input().split()))
L.extend(lis)
L.sort()
for i in range(L[0], L[-1]+1):
if i in L:
# remove()函数移除某个值的第一个匹配项
L.remove(i)
if i in L:
n = i
else:
m = i
print(str(m)+' '+str(n))
题目:
时间限制:
1s
内存限制:
128MB
题目描述:
FJ在沙盘上写了这样一些字符串:
A1 = “A”
A2 = “ABA”
A3 = “ABACABA”
A4 = “ABACABADABACABA”
……
你能找出其中的规律并写所有的数列AN吗?
输入描述:
仅有一个数:N ≤ 26。
输出描述:
请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
样例输入:
3
样例输出:
ABACABA
答案:
分析:
ord()
函数,chr()
函数,递归
def func(n):
if n==1:
return 'A'
else:
s = chr(ord('A')+n-1)
return func(n-1)+s+func(n-1)
print(func(int(input())))
题目:
时间限制:
1s
内存限制:
128MB
题目描述:
最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。
不妨设
A n = s i n ( 1 – s i n ( 2 + s i n ( 3 – s i n ( 4 + . . . s i n ( n ) ) . . . ) An=sin(1–sin(2+sin(3–sin(4+...sin(n))...) An=sin(1–sin(2+sin(3–sin(4+...sin(n))...)
S n = ( . . . ( A 1 + n ) A 2 + n − 1 ) A 3 + . . . + 2 ) A n + 1 Sn=(...(A1+n)A2+n-1)A3+...+2)An+1 Sn=(...(A1+n)A2+n−1)A3+...+2)An+1
FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题。
输入描述:
仅有一个数:N<201。
输出描述:
请输出相应的表达式Sn,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
样例输入:
3
样例输出:
( ( s i n ( 1 ) + 3 ) s i n ( 1 − s i n ( 2 ) ) + 2 ) s i n ( 1 − s i n ( 2 + s i n ( 3 ) ) ) + 1 ((sin(1)+3)sin(1-sin(2))+2)sin(1-sin(2+sin(3)))+1 ((sin(1)+3)sin(1−sin(2))+2)sin(1−sin(2+sin(3)))+1
答案:
分析:
找规律:
A 1 = s i n ( 1 ) A1=sin(1) A1=sin(1)
A 2 = s i n ( 1 − s i n ( 2 ) ) A2=sin(1-sin(2)) A2=sin(1−sin(2))
…
def a(n):
for i in range(1, n+1):
print('sin(', end='')
print(i, end='')
if i!=n:
if i%2!=0:
print('-',end='')
else:
print('+', end='')
for i in range(1, n+1):
print(')', end='')
return ''
def s(n):
for i in range(1, n):
print('(', end='')
for i in range(1, n+1):
print(a(i), end='')
print('+', end='')
print(n-i+1, end='')
if i!=n:
print(')', end='')
s(int(input()))
题目:
时间限制:
1s
内存限制:
128MB
题目描述:
求出区间[a,b]中所有整数的质因数分解。
提示:
先筛出所有素数,然后再分解。
数据规模和约定
输入描述:
输入两个整数a,b。
2 ≤ a ≤ b ≤ 10000 2\leq a\leq b\leq 10000 2≤a≤b≤10000
输出描述:
每行输出一个数的分解,形如 k = a 1 ∗ a 2 ∗ a 3... k=a1*a2*a3... k=a1∗a2∗a3...( a 1 ≤ a 2 ≤ a 3... a1\leq a2\leq a3... a1≤a2≤a3..., k k k 也是从小到大的)(具体可看样例)
样例输入:
3 10
样例输出:
3 = 3 3=3 3=3
4 = 2 ∗ 2 4=2*2 4=2∗2
5 = 5 5=5 5=5
6 = 2 ∗ 3 6=2*3 6=2∗3
7 = 7 7=7 7=7
8 = 2 ∗ 2 ∗ 2 8=2*2*2 8=2∗2∗2
9 = 3 ∗ 3 9=3*3 9=3∗3
10 = 2 ∗ 5 10=2*5 10=2∗5
答案:
分析:
自定义函数来判断是否是质数;
分解质因数,找最小质因数,再利用递归找到所有质因数。
# 自定义函数来判断是否是质数
def isPrime(n):
for i in range(2, n//2+1):
if n%i==0:
return False
return True
# 分解质因数
def func(n, nums):
flag = 1
for i in range(2, n//2+1):
if n%i==0 and isPrime(i):
# 找到了最小的质因数
nums.append(str(i))
flag = i
break
if flag!=1:
# 找到最小的质因数flag,再找n//flag的最小质因数
func(n//flag, nums)
else:
# flag=1则说明只有本身是质因数
nums.append(str(n))
a,b = map(int, input().split())
for i in range(a, b+1):
nums = []
func(i, nums)
print('{}={}'.format(str(i),'*'.join(nums)))
题目:
时间限制:
1s
内存限制:
128MB
题目描述:
给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4种情况之一:
1:两个字符串长度不等。比如 Beijing 和 Hebei
2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Beijing
3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。比如 beijing 和 BEIjing
4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如 Beijing 和 Nanjing
编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号。
输入描述:
包括两行,每行都是一个字符串
输出描述:
仅有一个数字,表明这两个字符串的关系编号
样例输入:
BEIjing
beiJing
样例输出:
3
答案:
分析:
lower()
函数:将字符串中所有大写字母转换为小写字母。
s1 = input()
s2 = input()
if not len(s1)==len(s2):
print(1)
elif s1==s2:
print(2)
elif s1.lower()==s2.lower():
print(3)
else:
print(4)
题目:
时间限制:
1s
内存限制:
128MB
题目描述:
给定当前的时间,请用英文的读法将它读出来。
时间用时h和分m表示,在英文的读法中,读一个时间的方法是:
如果m为0,则将时读出来,然后加上“o’clock”,如3:00读作“three o’clock”。
如果m不为0,则将时读出来,然后将分读出来,如5:30读作“five thirty”。
时和分的读法使用的是英文数字的读法,其中0~20读作:
0:zero, 1: one, 2:two, 3:three, 4:four, 5:five, 6:six, 7:seven, 8:eight, 9:nine, 10:ten, 11:eleven, 12:twelve, 13:thirteen, 14:fourteen, 15:fifteen, 16:sixteen, 17:seventeen, 18:eighteen, 19:nineteen, 20:twenty。
30读作thirty,40读作forty,50读作fifty。
对于大于20小于60的数字,首先读整十的数,然后再加上个位数。如31首先读30再加1的读法,读作“thirty one”。
按上面的规则21:54读作“twenty one fifty four”,9:07读作“nine seven”,0:15读作“zero fifteen”。
输入描述:
输入包含两个非负整数h和m,表示时间的时和分。非零的数字前没有前导0。h小于24,m小于60。
输出描述:
输出时间时刻的英文。
样例输入:
0 15
样例输出:
zero fifteen
答案:
分析:
见代码注释。
dic1 = {0:'zero', 1:'one', 2:'two', 3:'three', 4:'four', 5:'five', 6:'six',
7:'seven', 8:'eight', 9:'nine', 10:'ten', 11:'eleven', 12:'twelve',
13:'thirteen', 14:'fourteen', 15:'fifteen', 16:'sixteen', 17:'seventeen',
18:'eighteen', 19:'nineteen', 20:'twenty'}
dic2 = {2:'twenty', 3:'thirty', 4:'forty', 5:'fifty'}
L = [int(i) for i in input().split()]
def to_str(n):
if n<=20:
# 小于20用dic1
return dic1[n]
else:
# 否则用dic2
lis = list(str(n))
s = dic2[int(lis[0])]+' '+dic1[int(lis[1])]
return s
if L[1]==0:
# 整点
print(to_str(L[0])+" o'clock")
else:
# 非整点
print(to_str(L[0])+' '+to_str(L[1]))
题目:
时间限制:
1s
内存限制:
128MB
题目描述:
话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以上,它们就会停下来休息s秒。对于不同的兔子,t,s的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。
然而有些比赛相当漫长,全程观看会耗费大量时间,而小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度v1(表示每秒兔子能跑v1 米),乌龟的速度v2,以及兔子对应的t,s值,以及赛道的长度l——就能预测出比赛的结果。但是小华很懒,不想通过手工计算推测出比赛的结果,于是他找到了你——清华大学计算机系的高才生——请求帮助,请你写一个程序,对于输入的一场比赛的数据v1,v2,t,s,l,预测该场比赛的结果。
输入描述:
输入只有一行,包含用空格隔开的五个正整数v1,v2,t,s,l,其中( v 1 , v 2 ≤ 100 ; t ≤ 300 ; s < ≤ 10 ; l ≤ 10000 且 为 v 1 , v 2 的 公 倍 数 v1,v2\leq 100;t\leq 300;s<\leq 10; l\leq 10000且为v1,v2的公倍数 v1,v2≤100;t≤300;s<≤10;l≤10000且为v1,v2的公倍数)
输出描述:
输出包含两行,第一行输出比赛结果——一个大写字母“T”或“R”或“D”,分别表示乌龟获胜,兔子获胜,或者两者同时到达终点。
第二行输出一个正整数,表示获胜者(或者双方同时)到达终点所耗费的时间(秒数)。
样例输入:
10 5 5 2 20
样例输出:
D
4
答案:
分析:
无
v1, v2, t, s, l = map(int,input().split())
# 初始化两者路程,以及时间
x1, x2, time = 0, 0, 0
while x1 < l and x2 < l:
x1 += v1
x2 += v2
time += 1
if (x1-x2) >= t and x1 < l and x2 < l:
for i in range(s):
x2 += v2
time += 1
if x2 >= l:
break
if x1 == x2:
print('D')
elif x1 > x2:
print('R')
else:
print('T')
print(time)