Python:基于openjudge的四十二道题目

目录

声明:

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道题,或者学完了这些题,也有的小伙伴收藏可能是为了查找作业的。我觉得都挺好的,让我们一起学习吧!

你可能感兴趣的:(Python代码,python,开发语言)