Python基础的四十二道题目(由易到难)
在前期学习python的时候,看的是北京大学的郭炜老师的Mooc,讲的很棒,我后面只看到了第八章,那么对于我来说是足够用了,最近有想要看看后面的,之前做到openjudge的栏目收入的是这个Mooc的oj平台的题目,我会把之前的专栏删除,添加到这里来,如果有时间,我会再更新这里。(很可能不会)不过我觉得大家学会这些题目,对于python的学习,我觉得应该是够了,不管后期要学哪方面,补一补忘记的地方
目录
*注:直通车:实用python程序设计
声明:
在前期学习python的时候,看的是北京大学的郭炜老师的Mooc,讲的很棒,我后面只看到了第八章,那么对于我来说是足够用了,最近有想要看看后面的,之前做到openjudge的栏目收入的是这个Mooc的oj平台的题目(课程搭配了oj平台,这是我推荐的原因),我会把之前的专栏删除,添加到这里来,如果有时间,我会再更新这里。(很可能不会)不过我觉得大家学会这些题目,对于python的学习,我觉得应该是够了,不管后期要学哪方面,补一补忘记的地方,很快就能上手,python的难度不在语法,而在于它拥有许许多多的第三方库,每种库的学习也都是了解函数有什么功能,具体到用的时候在去查找。
1、字符三角形
描述
给定一个字符,用它构造一个底边长5个字符,高3个字符的等腰字符三角形。
输入
输入只有一行, 包含一个字符。
输出
该字符构成的等腰三角形,底边长5个字符,高3个字符。
输入
*
输出
* *** *****
实例
a=input()
print(" "+a)
print(" "+a+a+a)
print(a*5)
2、输出第二个整数
描述
输入三个整数,把第二个输入的整数输出。
输入
只有一行,共三个整数,整数之间由一个空格分隔。整数是32位有符号整数。
输出
只有一行,一个整数,即输入的第二个整数。
实例输入
123 456 789
样例输出
456
实例
a=input().split()
print(a[1])
3、求三个数的和
描述
输入三个整数或小数,输出它们的和如果结果是整数,就保留小数点后面一位的0(用python写则不用特别处理,程序自然会如此)
输入
输入三个整数或小数
输出
和
实例输入
1 2.3 4.7
实例输出
8.0
实例
s=input().split()
print(float(s[0])+float(s[1] )+float(s[2]))
4、openjudge:判断子串
描述
输入两行字符串,要求判断第一行 字符串是不是第二行的子串
输入
两行字符串。字符串长度不超过100。
输出
如果第一行是第二行的子串,就输出 "YES",否则输出"NO"
样例输入
hello world
this is hello world, it is ok.
样例输出
YES
提示
python中每使用调用一次 input(),就输入一行的内容。输入内容有几行,就要用几次 input()
实例
s=input()
e=input()
if s in e:
print("YES")
else:
print("NO")
5、计算(a+b)*c的值
描述
给定3个整数a、b、c,计算表达式(a+b)*c的值。
输入
输入仅一行,包括三个整数a、b、c, 数与数之间以一个空格分开。
(-10,000 < a,b,c < 10,000)
输出
输出一行,即表达式的值
样例输入
2 3 5
样例输出
25
实例
a=input().split()
a,b,c=int(a[0]),int(a[1]),int(a[2])
print((a+b)*c)
6、反向输出一个三位数
描述
将一个三位数反向输出。
输入
一个三位数n。
输出
反向输出n。
实例输入
100
实例输出
001
实例
a=input()
print(a[2]+a[1]+a[0])
7、字符串交换
描述
输入两个长度为4的字符串,交换这两个字符串的前两个字符后输出
输入
两个长度为4的字符串
输出
交换这两个字符串的前两个字符后输出
实例输入
ABCD
1234
实例输出
12CD
AB34
实例
a=input()
b=input()
print(b[0]+b[1]+a[2]+a[3])
print(a[0]+a[1]+b[2]+b[3])
8、字符串中的整数求和
描述
输入两个长度为3的字符串,每个串前两个字符是数字,后一个字符是字母。 求这两个串中的整数的和
输入
一行,两个字符串
输出
两个字符串中整数的和
实例输入
12B 34D
实例输出
46
实例
s=input()
a=int(s[0]+s[1])
b=int(s[4]+s[5])
print(a+b)
9、计算二的幂
问题
给定非负整数n,求2n。
输入
一个整数n。0 <= n < 31。
输出
一个整数,即2的n次方。
实例输入
3
实例例输出
8
代码
s=int(input())
print(2**s)
10、计算多项式的值
描述
对于多项式f(x) = ax3 + bx2 + cx + d 和给定的a, b, c, d, x,计算f(x)的值。
输入
输入仅一行,包含5个实数,分别是x,及参数a、b、c、d的值,每个数都是绝对值不超过100的双精度浮点数。数与数之间以一个空格分开。
输出
输出一个实数,即f(x)的值,保留到小数点后7位。
实例输入
2.31 1.2 2 2 3
实例输出
33.0838692
代码
s=input().split()
x,a,b,c,d=float(s[0]),float(s[1]),float(s[2]),float(s[3]),float(s[4])
print("%.7f" % (a*(x**3) + b*(x**2) + c*x + d))
11、奇偶数判断
描述
给定一个整数,判断该数是奇数还是偶数。
输入
输入仅一行,一个大于零的正整数n。
输出
输出仅一行,如果n是奇数,输出odd;如果n是偶数,输出even。
实例输入
5
实例输出
odd
实例
a=int(input())
if a%2==0:
print("even")
else:
print("odd")
12、点和正方形的关系
描述
有一个正方形,四个角的坐标(x,y)分别是(1,-1),(1,1),(-1,-1),(-1,1),x是横轴,y是纵轴。写一个程序,判断一个给定的点是否在这个正方形内(包括正方形边界)。
输入
输入一行,包括两个整数x、y,以一个空格分开,表示坐标(x,y)。
输出
输出一行,如果点在正方形内,则输出yes,否则输出no。
实例输入
1 1
实例输出
yes
实例
s=input().split()
x=float(s[0])
y=float(s[1])
if x>1 or x<-1 or y>1 or y<-1:
print("no")
else:
print("yes")
13、三角形判断
描述
给定三个正整数,分别表示三条线段的长度,判断这三条线段能否构成一个三角形。
输入
输入共一行,包含三个正整数,分别表示三条线段的长度,数与数之间以一个空格分开。
输出
如果能构成三角形,则输出“yes” ,否则输出“no”。
样例输入
3 4 5
样例输出
yes
实例
a=input().split()
a,b,c=int(a[0]),int(a[1]),int(a[2])
if a+b>c and a+c>b and b+c>a:
print("yes")
else:
print("no")
14、计算邮资
题目:
根据邮件的重量和用户是否选择加急计算邮费。计算规则:重量在1000克以内(包括1000克), 基本费8元。超过1000克的部分,每500克加收超重费4元,不足500克部分按500克计算;如果用户选择加急,多收5元。
输入
输入一行,包含整数和一个字符,以一个空格分开,分别表示重量(单位为克)和是否加急。如果字符是y,说明选择加急;如果字符是n,说明不加急。
输出
输出一行,包含一个整数,表示邮费。
实例输入
1200 y
实例输出
17
代码
s=input().split()
a=int(s[0])
if s[1] in 'y':
x=5
else:
x=0
if a<=1000:
print(8+x)
else:
if (a-1000)P0==0:
print(int((a-1000)/500*4+x+8))
else:
print((int((a - 1000)/500)+1)*4+x+8)
15、分段函数
描述
编写程序,计算下列分段函数y=f(x)的值。
y=-x+2.5; 0 <= x < 5
y=2-1.5(x-3)(x-3); 5 <= x < 10
y=x/2-1.5; 10 <= x < 20
输入
一个浮点数N,0 <= N < 20
输出
输出N对应的分段函数值:f(N)。结果保留到小数点后三位。
实例输入
1.0
实例输出
1.500
实例
x=float(input())
if 0<=x and x<5:
y = -x + 2.5
print('%.3f'%y)
elif 5<=x and x<10:
y=2-1.5*(x-3)*(x-3)
print('%.3f'%y)
elif 10<=x and x<20:
y=x/2-1.5
print('%.3f'%y)
16、简单计算器
描述
一个最简单的计算器,支持+, -, *, / 四种运算。仅需考虑输入输出为整数的情况(除法结果就是商,忽略余数)
输入
输入只有一行,共有三个参数,其中第1、2个参数为整数,第3个参数为操作符(+,-,*,/)。
输出
输出只有一行,一个整数,为运算结果。然而:
1. 如果出现除数为0的情况,则输出:Divided by zero!
2. 如果出现无效的操作符(即不为 +, -, *, / 之一),则输出:Invalid operator!
样例输入
1 2 +
样例输出
3
代码(1)
s=input().split()
a,b,c=int(s[0]),int(s[1]),s[2]
if c in ['+','-','*','/']:
if c=='+':
print(a+b)
elif c=='-':
print(a-b)
elif c=='*':
print(a*b)
else:
if b==0:
print('Divided by zero!')
else:
print(a//b)
else:
print("Invalid operator!")
代码(2)
s=input().split()
if s[2] not in ['+','-','*','/']:
print("Invalid operator!")
elif s[2] == '/' and int(s[1]) == 0:
print('Divided by zero!')
else:
print(int(eval(s[0]+s[2]+s[1])))
17、矩阵乘法
描述
计算两个矩阵的乘法。n*m阶的矩阵A乘以m*k阶的矩阵B得到的矩阵C 是n*k阶的,且C[i][j] = A[i][0]*B[0][j] + A[i][1]*B[1][j] + …… +A[i][m-1]*B[m-1][j](C[i][j]表示C矩阵中第i行第j列元素)。
输入
第一行为n, m, k,表示A矩阵是n行m列,B矩阵是m行k列,n, m, k均小于100
然后先后输入A和B两个矩阵,A矩阵n行m列,B矩阵m行k列,矩阵中每个元素的绝对值不会大于1000。
输出
输出矩阵C,一共n行,每行k个整数,整数之间以一个空格分开。
样例输入
3 2 3 1 1 1 1 1 1 1 1 1 1 1 1
样例输出
2 2 2 2 2 2 2 2 2
n, m, k = map(int,input().split())
a = []
b = []
d = []
total=0
for i in range(k):
d.append(0)
c=[d]*n
for i in range(n):
s=list(map(int,input().split()))
a.append(s)
for j in range(m):
t=list(map(int,input().split()))
b.append(t)
for i in range(n):
for j in range(k):
for s in range(m):
total+=a[i][s]*b[s][j]
c[i][j]=total
print(c[i][j],end=" ")
total=0
print(" ")
18、大象喝水
描述
一只大象口渴了,要喝20升水才能解渴,但现在只有一个深h厘米,底面半径为r厘米的小圆桶(h和r都是整数)。问大象至少要喝多少桶水才会解渴。
输入
输入有一行:包含两个整数,以一个空格分开,分别表示小圆桶的深h和底面半径r,单位都是厘米。
输出
输出一行,包含一个整数,表示大象至少要喝水的桶数。
实例输入
23 11
实例输出
3
提示
如果一个圆桶的深为h厘米,底面半径为r厘米,那么它最多能装Pi * r * r * h立方厘米的水。(设Pi=3.14159)
1升 = 1000毫升
1毫升 = 1 立方厘米
实例
x=input().split()
h,r=int(x[0]),int(x[1])
Pi=3.14159
V=Pi * r * r * h
if V>20000:
print(1)
elif 20000%V==0 and V<20000: print(20000/V)
else:
print(int(20000/V)+1)
19、苹果和虫子2
描述
你买了一箱n个苹果,很不幸的是买完时箱子里混进了一条虫子。虫子每x小时能吃掉一个苹果,假设虫子在吃完一个苹果之前不会吃另一个,那么经过y小时你还有多少个完整的苹果?
输入
输入仅一行,包括n,x和y(均为整数)。
输出
输出也仅一行,剩下的苹果个数
实例输入
10 4 9
实例输出
7
代码
s=input().split()
n,x,y=int(s[0]),int(s[1]),int(s[2])
if n-y/x<0:
print(0)
else:
if y%x==0:
print(int(n - y / x))
else:
print(n-(int(y/x)+1))
20、求一元二次方程的根
描述
利用公式x1 = (-b + sqrt(b*b-4*a*c))/(2*a), x2 = (-b - sqrt(b*b-4*a*c))/(2*a)求一元二次方程ax2+ bx + c =0的根,其中a不等于0。
输入
输入一行,包含三个浮点数a, b, c(它们之间以一个空格分开),分别表示方程ax2 + bx + c =0的系数。
输出
输出一行,表示方程的解。
若b2 = 4 * a * c,则两个实根相等,则输出形式为:x1=x2=...。
若b2 > 4 * a * c,则两个实根不等,则输出形式为:x1=...;x2 = ...,其中x1>x2。
若b2 < 4 * a * c,则有两个虚根,则输出:x1=实部+虚部i; x2=实部-虚部i,即x1的虚部系数大于等于x2的虚部系数,实部为0时不可省略。实部 = -b / (2*a), 虚部 = sqrt(4*a*c-b*b) / (2*a)
所有实数部分要求精确到小数点后5位,数字、符号之间没有空格。
样例输入
11.0 2.0 8.0 21 0 1
样例输出
1x1=-1.00000+2.64575i;x2=-1.00000-2.64575i 2x1=0.00000+1.00000i;x2=0.00000-1.00000i
代码
s=input().split()
a,b,c=float(s[0]),float(s[1]),float(s[2])
dat=b*b-4*a*c
x1 = (-b + (b*b-4*a*c)**0.5)/(2*a)
x2 = (-b - (b*b-4*a*c)**0.5)/(2*a)
if dat==0:
print("x1=x2=%.5f" %x1)
elif dat>0:
if x1>x2:
print("x1=%.5f;x2=%.5f" %(x1,x2))
else:
print("x1=%.5f;x2=%.5f" %(x2,x1))
else:
n=-b / (2*a)
m=((4*a*c-b*b)**0.5) / (2*a)
if n==0:
print("x1=%.5f+%.5fi;x2=%.5f-%.5fi" %(b,m,b,m))
else:
print("x1=%.5f+%.5fi;x2=%.5f-%.5fi" %(n,m,n,m))
21、求整数的和与均值
描述
读入n(1 <= n <= 10000)个整数,求它们的和与均值。
输入
输入第一行是一个整数n,表示有n个整数。
第2~n+1行每行包含1个整数。每个整数的绝对值均不超过10000。
输出
输出一行,先输出和,再输出平均值(保留到小数点后5位),两个数间用单个空格分隔。
样例输入
4 344 222 343 222
样例输出
1131 282.75000
代码
n = int(input())
total = 0
for i in range(n):
s = int(input())
total += s
print(total, end=" ")
t = float(total/n)
print("%.5f" % t)
22、整数序列的元素最大跨度值
描述
给定一个长度为n的非负整数序列,请计算序列的最大跨度值(最大跨度值 = 最大值减去最小值)。
输入
一共2行,第一行为序列的个数n(1 <= n <= 1000),第二行为序列的n个不超过1000的非负整数,整数之间以一个空格分隔。
输出
输出一行,表示序列的最大跨度值。
样例输入
6 3 0 8 7 5 9
样例输出
9
代码
n=int(input())
s=input().split()
maxV=minV=int(s[0])
for i in s:
maxV=max(maxV,int(i))
minV=min(minV,int(i))
print(maxV-minV)
23、鸡尾酒疗法
描述
鸡尾酒疗法,原指“高效抗逆转录病毒治疗”(HAART),由美籍华裔科学家何大一于1996年提出,是通过三种或三种以上的抗病毒药物联合使用来治疗艾 滋病。该疗法的应用可以减少单一用药产生的抗药性,最大限度地抑制病毒的复制,使被破坏的机体免疫功能部分甚至全部恢复,从而延缓病程进展,延长患者生 命,提高生活质量。人们在鸡尾酒疗法的基础上又提出了很多种改进的疗法。为了验证这些治疗方法是否在疗效上比鸡尾酒疗法更好,可用通过临床对照实验的方式 进行。假设鸡尾酒疗法的有效率为x,新疗法的有效率为y,如果y-x大于5%,则效果更好,如果x-y大于5%,则效果更差,否则称为效果差不多。下面给 出n组临床对照实验,其中第一组采用鸡尾酒疗法,其他n-1组为各种不同的改进疗法。请写程序判定各种改进疗法效果如何。
输入
第一行为整数n( 1 < n <= 20);
其余n行每行两个整数,第一个整数是临床实验的总病例数(小于等于10000),第二个疗效有效的病例数。
这n行数据中,第一行为鸡尾酒疗法的数据,其余各行为各种改进疗法的数据。
输出
有n-1行输出,分别表示对应改进疗法的效果:
如果效果更好,输出better;如果效果更差,输出worse;否则输出same
样例输入
5 125 99 112 89 145 99 99 97 123 98
样例输出
same worse better same
代码
n=int(input())
s=input().split()
a=int(s[1])
b=int(s[0])
x=a/b
for i in range(1,n):
t=input().split()
c=int(t[1])
d=int(t[0])
y=c/d
if (y-x) > 0.05:
print('better')
elif (x-y) > 0.05:
print('worse')
else:
print('same')
24、角谷猜想
描述
所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘3加1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到1。如,假定初始整数为5,计算过程分别为16、8、4、2、1。
程序要求输入一个整数,将经过处理得到1的过程输出来。
输入
一个正整数N(N <= 2,000,000)
输出
从输入整数到1的步骤,每一步为一行,每一部中描述计算过程。最后一行输出"End"。如果输入为1,直接输出"End"。
样例输入
5
样例输出
5*3+1=16 16/2=8 8/2=4 4/2=2 2/2=1 End
n=int(input())
while n!=1:
if n%2:
print(str(n)+"*3+1="+str(n*3+1))
n=n*3+1
else:
print(str(n)+"/2="+str(n//2))
n//=2
print("End")
25、正常血压
描述
监护室每小时测量一次病人的血压,若收缩压在90 - 140之间并且舒张压在60 - 90之间(包含端点值)则称之为正常,现给出某病人若干次测量的血压值,计算病人保持正常血压的最长小时数。
输入
第一行为一个正整数n,n < 100
其后有n行,每行2个正整数,分别为一次测量的收缩压和舒张压,中间以一个空格分隔。
输出
输出仅一行,血压连续正常的最长小时数。
样例输入
4 100 80 90 50 120 60 140 90
样例输出
2
代码
n = int(input())
total = 0
Maxtotal=0
for i in range(n):
s = input().split()
t, d = int(s[0]), int(s[1])
if 90<= t <=140 and 60<= d <=90:
total+=1
if Maxtotal<=total:
Maxtotal = total
else:
total = 0
print(Maxtotal)
26、奥运奖牌计数
描述
2008年北京奥运会,A国的运动员参与了n天的决赛项目(1≤n≤17)。现在要统计一下A国所获得的金、银、铜牌数目及总奖牌数。
输入
输入n+1行,第1行是A国参与决赛项目的天数n,其后n行,每一行是该国某一天获得的金、银、铜牌数目,以一个空格分开。
输出
输出1行,包括4个整数,为A国所获得的金、银、铜牌总数及总奖牌数,以一个空格分开。
样例输入
3 1 0 3 3 1 0 0 3 0
样例输出
4 4 3 11
代码
n = int(input())
a = b = c = 0
for i in range(n):
s = input().split()
a += int(s[0])
b += int(s[1])
c += int(s[2])
total = a+b+c
print(a, b, c, total, end="")
27、求特殊自然数
描述
一个十进制自然数,它的七进制与九进制表示都是三位数,且七进制与九进制的三位数码表示顺序正好相反。编程求此自然数,并输出显示。
输入
无。
输出
三行:
第一行是此自然数的十进制表示;
第二行是此自然数的七进制表示;
第三行是此自然数的九进制表示。
样例输入
(无)
样例输出
(不提供)
代码
for a in range(1,7):
for b in range(0,7):
for c in range(1,7):
if c+b*7+a*49 == a+b*9+c*81:
print(c+b*7+a*49)
print(str(a)+str(b)+str(c))
print(str(c)+str(b)+str(a))
28、数字统计
描述
请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。
比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次,在数20中出现1次,在数21中出现1次,在数22中出现2次,所以数字2在该范围内一共出现了6次。
输入
输入共 1 行,为两个正整数 L 和 R,之间用一个空格隔开。
输出
输出共 1 行,表示数字 2 出现的次数。
样例输入
样例 #1: 2 22 样例 #2: 2 100
样例输出
样例 #1: 6 样例 #2: 20
代码1
s=input().split()
L,R=int(s[0]),int(s[1])
total=0
for i in range(L,R+1):
while i!=0:
m=i%10
if m == 2:
total+=1
i//=10
print(total)
代码2
s=input().split()
L,R=int(s[0]),int(s[1])
total=0
for i in range(L,R+1):
s=str(i)
for x in s:
if x == '2':
total+=1
print(total)
29、数字反转
描述
给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例2)。
输入
输入共 1 行,一个整数N。
-1,000,000,000 ≤ N≤ 1,000,000,000。
输出
输出共 1 行,一个整数,表示反转后的新数。
样例输入
样例 #1: 123 样例 #2: -380
样例输出
样例 #1: 321 样例 #2: -83
代码
n = str(input())
L=len(n)
a=' '
if n == 0:
print('0')
else:
if n[0] == "-":
n = n[1:L]
for i in n:
if n[-1] == 0:
continue
a += i
x = a[::-1]
y = str(int(x))
print('-'+y)
else:
for i in n:
if n[-1]== 0:
continue
a += i
x = a[L:0:-1]
y = str(int(x))
print(y)
30、求最大公约数问题
描述
给定两个正整数,求它们的最大公约数。
输入
输入一行,包含两个正整数(<1,000,000,000)。
输出
输出一个正整数,即这两个正整数的最大公约数。
样例输入
6 9
样例输出
3
提示
求最大公约数可以使用辗转相除法:
假设a > b > 0,那么a和b的最大公约数等于b和a%b的最大公约数,然后把b和a%b作为新一轮的输入。
由于这个过程会一直递减,直到a%b等于0的时候,b的值就是所要求的最大公约数。
比如:
9和6的最大公约数等于6和9%6=3的最大公约数。
由于6%3==0,所以最大公约数为3。
代码
s = input().split()
a, b = int(s[0]), int(s[1])
if a > b:
while a%b!=0:
c = a % b
a = b
b = c
print(b)
else:
while b%a!=0:
c = b % a
b = a
a = c
print(a)
31、多少种取法
描述
给定三个正整数m,n,s问从1到m这m个数里面取n个不同的数,使它们和是s,有多少种取法
输入
多组数据
输入的第一行是整数t,表示有t组数据
此后有t行,每行是一组数据
每组数据就是三个正整数,m,n, s ( n <= 10,s <= 20)
输出
对每组数据,输出答案
样例输入
5 13 4 20 12 5 18 1 1 1 1 2 1 119 3 20
样例输出
22 3 1 0 24
提示
用函数ways(m,n,s)表示 从1到m这m个数里面取n个不同的数,使它们和是s的取法总数
显然,必须取m个数,不能不取(除非m == 0)
1) 考虑如果 m > s, 问题可以等价于什么?
2) 对于m<= s的情况,把所有的取法分成两类:
第一类: 取m。则取m后,剩下的问题变成什么?
第二类: 不取m,那么剩下的问题变成什么?
3) 注意边界条件(即递归终止条件,即不需要递归的条件)
边界条件一般是 n,m,s = 0, = 1 之类的情况。
例如:从 1-m这m个数里面,取0个数,使得它们的和是0,有几种取法? 答案是1。
从 1到m这m个数里面,取0个数,使得它们的和是s(s>0),有几种取法? 答案是0。无解对应的答案就是0.
当 m < n时,答案是0,因为没法取n个数
当 m = 0时,只要m和s有一个不是0,ways(m,n,s)就应该返回0。
递归的时候,函数的参数会减少,如果会出现某个参数一直没完没了减少下去,那就不对了。因此,边界条件一定要考虑周全,确保递归可以终止。
边界条件可以有多种写法。
代码
def ways(m,n,s):
if n == 0 and s == 0:
return 1
elif m == 0 or n == 0:
return 0
else:
return ways(m-1,n-1,s-m)+ways(m-1,n,s)
n = int(input())
for i in range(n):
a, b, c = map(int,input().split())
#map()会根据提供的函数对指定的序列做出映射
print(ways(a,b,c))
32、石头剪刀布
描述
石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。
一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问,小A和小B比了N轮之后,谁赢的轮数多?
输入
输入包含三行。
第一行包含三个整数:N,NA,NB,分别表示比了N轮,小A出拳的周期长度,小B出拳的周期长度。0 < N,NA,NB < 100。
第二行包含NA个整数,表示小A出拳的规律。
第三行包含NB个整数,表示小B出拳的规律。
其中,0表示“石头”,2表示“剪刀”,5表示“布”。相邻两个整数之间用单个空格隔开。
输出
输出一行,如果小A赢的轮数多,输出A;如果小B赢的轮数多,输出B;如果两人打平,输出draw。
样例输入
10 3 4 0 2 5 0 5 0 2
样例输出
A
提示
对于测试数据,猜拳过程为:
A:0 2 5 0 2 5 0 2 5 0
B:0 5 0 2 0 5 0 2 0 5
A赢了4轮,B赢了2轮,双方打平4轮,所以A赢的轮数多。
代码
def result(a , b):
if a == b:
return 0
if a == 5 and b == 0:
return 1
if a == 0 and b == 5:
return -1
if a < b:
return 1
else:
return -1
s = input().split()
n, na, nb = int(s[0]), int(s[1]), int(s[2])
sa = input().split()
sb = input().split()
winA = winB = 0
pA = pB = 0
for i in range(n):
r = result(int(sa[pA]), int(sb[pB]))
if r == 1:
winA += 1
elif r == -1:
winB += 1
pA = (pA + 1) % na
pB = (pB + 1) % nb
if winA > winB:
print("A")
elif winA < winB:
print("B")
else:
print("draw")
33、统计数字字符个数
描述
输入一行字符,统计出其中数字字符的个数。
输入
一行字符串,总长度不超过255。
输出
输出为1行,输出字符串里面数字字符的个数。
样例输入
Peking University is set up at 1898.
样例输出
4
代码1
s = input()
sum = 0
for i in s:
if '0'<= i <='9':
sum += 1
print(sum)
代码2
s = input()
sum = 0
for i in s:
if i.isdigit():
sum += 1
print(sum)
34、大小写字母互换
描述
把一个字符串中所有出现的大写字母都替换成小写字母,同时把小写字母替换成大写字母。
输入
输入一行:待互换的字符串。
输出
输出一行:完成互换的字符串(字符串长度小于80)。
样例输入
If so, you already have a Google Account. You can sign in on the right.
样例输出
iF SO, YOU ALREADY HAVE A gOOGLE aCCOUNT. yOU CAN SIGN IN ON THE RIGHT.
代码
s = input()
for c in s:
if 'a' <= c <= 'z':
print(chr(ord(c) - 32 ),end="")
elif 'A' <= c <= 'Z':
print(chr(ord(c) + 32),end="")
else:
print(c,end="")
35、过滤多余的空格
描述
一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格。
输入
一行,一个字符串(长度不超过200),句子的头和尾都没有空格。
输出
过滤之后的句子。
样例输入
Hello world.This is c language.
样例输出
Hello world.This is c language.
代码
s = input().split()
for i in s:
print(i, end=" ")
36、找第一个只出现一次的字符
描述
给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有,输出no。
输入
一个字符串,长度小于100000。
输出
输出第一个仅出现一次的字符,若没有则输出no。
实例输入
abcabd
实例输出
c
代码
while True:
try:
a = input().strip()
for i in a:
if a.count(i) == 1:
print(i)
exit(0)
else:
print('no')
except:
break
37、判断字符串是否为回文
描述
输入一个字符串,输出该字符串是否回文。回文是指顺读和倒读都一样的字符串。
输入
输入为一行字符串(字符串中没有空白字符,字符串长度不超过100)。
输出
如果字符串是回文,输出yes;否则,输出no。
实例输入
abcdedcba
实例输出
yes
代码
a = input()
if a == a[::-1]:
print('yes')
else:
print('no')
38、字符串最大跨距
描述
有三个字符串S,S1,S2,其中,S长度不超过300,S1和S2的长度不超过10。想检测S1和S2是否同时在S中出现,且S1位于S2的左边,并在S中互不交叉(即,S1的右边界点在S2的左边界点的左侧)。计算满足上述条件的最大跨距(即,最大间隔距离:最右边的S2的起始点与最左边的S1的终止点之间的字符数目)。如果没有满足条件的S1,S2存在,则输出-1。
例如,S = "abcd123ab888efghij45ef67kl", S1="ab", S2="ef",其中,S1在S中出现了2次,S2也在S中出现了2次,最大跨距为:18。
输入
三个串:S, S1, S2,其间以逗号间隔(注意,S, S1, S2中均不含逗号和空格);
输出
S1和S2在S最大跨距;若在S中没有满足条件的S1和S2,则输出-1。
样例输入
abcd123ab888efghij45ef67kl,ab,ef
样例输出
18
代码
s = input().split(',')
a = s[0]
b = s[1]
c = s[2]
if b in a and c in a:
x = a.find(b)
y = a.rfind(c)
if x >= y:
print('-1')
else:
print(y-x-len(b))
else:
print('-1')
39、找出全部子串位置
描述
输入两个串s1,s2,找出s2在s1中所有出现的位置
两个子串的出现不能重叠。例如'aa'在 aaaa 里出现的位置只有0,2
输入
第一行是整数n
接下来有n行,每行两个不带空格的字符串s1,s2
输出
对每行,从小到大输出s2在s1中所有的出现位置。位置从0开始算
如果s2没出现过,输出 "no"
行末多输出空格没关系
样例输入
4 ababcdefgabdefab ab aaaaaaaaa a aaaaaaaaa aaa 112123323 a
样例输出
0 2 9 14 0 1 2 3 4 5 6 7 8 0 3 6 no
代码
n = int(input())
for i in range(n):
s = input().split()
m = 0
if s[1] not in s[0]:
print('no', end='')
for j in s[0]:
a = s[0].find(s[1],m)
if a == -1:
continue
else:
m = a + len(s[1])
print(a,'',end='')
print("") #每次循环换行
40、万年历
描述
给定年月日,求星期几。已知2020年11月18日是星期三。另外,本题有公元0年,这个和真实的纪年不一样
输入
第一行是n(n <=30),表示有n组数据
接下来n行,每行是一组数据。
每行三个整数y,m,d,分别代表年,月,日。(-1000000<=y<=1000000)
若今年是2017年,则往前就是2016年,2015年....一直数到2年,1年,再往前就是0年,-1年,-2年.....
输出
对每组数据,输出星期几,星期几分别用
"Sunday","Monday","Tuesday","Wednesday","Thursday", "Friday","Saturday" 表示
如果月份和日期不合法,输出"Illegal"
样例输入
6 2017 2 29 2017 13 2 0 1 1 -2 3 4 2017 10 18 2015 12 31
样例输出
Illegal Illegal Saturday Wednesday Wednesday Thursday
代码
def judge_week(year, month, day):
lst1 = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
lst2 = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
date = days = 0
lst_days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
if month in [1, 3, 5, 7, 8, 10, 12]:
if day < 1 or day > 31:
print('Illegal')
return
elif month == 2:
if (year % 4 == 0) and (year % 100 != 0) or year % 400 == 0:
if day < 1 or day > 29:
print('Illegal')
return
else:
if day < 1 or day > 28:
print('Illegal')
return
elif month in [4, 6, 9, 11]:
if day < 1 or day > 30:
print('Illegal')
return
else:
print('Illegal')
return
if year>=1: #1年1月1日为星期一
for i in range(1,year):
if (i % 4 == 0) and (i % 100 != 0) or i % 400 == 0:
days += 366
else:
days += 365 #累加整年数
if ((year % 4) == 0) and ((year % 100) != 0) or ((year % 400) == 0):
for i in range(month-1):
date +=lst1[i]
else:
for i in range(month-1):
date +=lst2[i] #累加整月数
total=date+day+days
x=total % 7
print(lst_days[x])
else:
for i in range(year+1, 1):
if (i % 4 == 0) and (i % 100 != 0) or i % 400 == 0:
days += 366
else:
days += 365 # 累加整年数
if ((year % 4) == 0) and ((year % 100) != 0) or ((year % 400) == 0):
for i in range(month - 1,12):
date += lst1[i]
else:
for i in range(month - 1,12):
date += lst2[i] # 累加整月数
total = date - day + 1 + days
x = total % 7
print(lst_days[(8-x)%7])
n = int(input())
for i in range(n):
year, month, day = map(int, input().split())
judge_week(year, mon, day)
41、病人排队
描述
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
1. 老年人(年龄 >= 60岁)比非老年人优先看病。
2. 老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
3. 非老年人按登记的先后顺序看病。
输入
第1行,输入一个小于100的正整数,表示病人的个数;
后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格隔开。
输出
按排好的看病顺序输出病人的ID,每行一个。
样例输入
5 021075 40 004003 15 010158 67 021033 75 102012 30
样例输出
021033 010158 021075 004003 102012
n = int(input())
a = []
for i in range(n):
s = input().split()
lst = [str(s[0]),int(s[1]),i] #添加上登记顺序
a.append(lst)
def f(x):
if x[1]>=60:
return(-x[1],x[2]) #年龄从大到小
else:
return(0,x[2])
a.sort(key=f) #key为自定义比较函数,按函数f的方式比较
for i in range(n):
print(a[i][0])
42、校园食宿预订系统
描述
某校园为方便学生订餐,推出食堂预定系统。食宿平台会在前一天提供菜单,学生在开饭时间前可订餐。 食堂每天会推出m个菜,每个菜有固定的菜价和总份数,售卖份数不能超过总份数。 假设共有n个学生点餐,每个学生固定点3个菜,当点的菜售罄时, 学生就买不到这个菜了。 请根据学生预定记录,给出食堂总的预定收入 数据满足1 <= n <= 6000,3 <= m <= 6000,单品菜价不大于1000元,每个菜的配额不超过3000
输入
第一行两个整数n和m,代表有n个学生订餐,共有m个可选的菜
下面m行,每行三个元素,分别是菜名、售价和可提供量,保证菜名不重合,菜价为整数
下面n行,每行三个元素,表示这个学生点的三个菜的菜名
输出
一个整数,表示食堂的收入
样例输入
5 5 yangroupaomo 13 10 jituifan 7 5 luosifen 16 3 xinlamian 12 20 juruo_milktea 999 1 yangroupaomo luosifen juruo_milktea luosifen xinlamian jituifan yangroupaomo jituifan juruo_milktea jituifan xinlamian luosifen yangroupaomo yangroupaomo yangroupaomo
样例输出
1157
提示
如果用python做,要用字典,
如果用其它语言做,也要用类似的数据结构
否则会超时
名字长度范围没有给出,长度不会太离谱。请自己选用合适的办法确保这不是个问题
n, m = map(int,input().split())
t={}
for i in range(m):
s = input().split()
name, price, num =s[0], int(s[1]), int(s[2])
t[name]=[price,num]
total = 0
for i in range(n):
names = input().split()
for name in names:
if t[name][1]>0:
total += t[name][0]
t[name][1] -= 1
print(total)
如果能看到这里,多半是看这里是不是有42道题,或者学完了这些题,也有的小伙伴收藏可能是为了查找作业的。我觉得都挺好的,让我们一起学习吧!
更多推荐
所有评论(0)