目录
文章来源地址https://www.toymoban.com/news/detail-417326.html
声明:
1、字符三角形
2、输出第二个整数
3、求三个数的和
4、openjudge:判断子串
5、计算(a+b)*c的值
6、反向输出一个三位数
7、字符串交换
8、字符串中的整数求和
9、计算二的幂
10、计算多项式的值
11、奇偶数判断
12、点和正方形的关系
13、三角形判断
14、计算邮资
15、分段函数
16、简单计算器
17、矩阵乘法
18、大象喝水
19、苹果和虫子2
20、求一元二次方程的根
21、求整数的和与均值
22、整数序列的元素最大跨度值
23、鸡尾酒疗法
24、角谷猜想
25、正常血压
26、奥运奖牌计数
27、求特殊自然数
28、数字统计
29、数字反转
30、求最大公约数问题
31、多少种取法
32、石头剪刀布
33、统计数字字符个数
34、大小写字母互换
35、过滤多余的空格
36、找第一个只出现一次的字符
37、判断字符串是否为回文
38、字符串最大跨距
39、找出全部子串位置
40、万年历
41、病人排队
42、校园食宿预订系统
*注:直通车:实用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道题,或者学完了这些题,也有的小伙伴收藏可能是为了查找作业的。我觉得都挺好的,让我们一起学习吧!文章来源:https://www.toymoban.com/news/detail-417326.html
到了这里,关于Python基础的四十二道题目(由易到难)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!