python 程序设计代码 1-4章

程序设计竞赛入门:python版 黄龙军 书籍算法代码

image

image

image

第一章

例1.5.1 a+b (处理T次)

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入两个整数a、b。

输出格式:
对于每组测试,输出一行,包含一个整数,表示a、b之和。

输入样例:
3
1 2
3 4
5 6
输出样例:
3
7
11

点击查看代码
T=int(input())
for i in range(T):
    a,b=input().split()
    c=int(a)+int(b)
    print(c)

例1.5.2 a+b (处理到特值结束)

求两个整数之和。

输入格式:
测试数据有多组。每组测试输入两个整数a、b,当a、b同时为0时,表示输入结束。

输出格式:
对于每组测试,输出一行,包含一个整数,表示a、b之和。

输入样例:
1 2
3 4
5 6
0 0
输出样例:
3
7
11

点击查看代码
while True:
    a,b=input().split()
    if a=='0' and b=='0':
        break
    c=int(a)+int(b)
    print(c)

例1.5.3 a+b (处理到文件尾)

求两个整数之和。

输入格式:
测试数据有多组,处理到文件尾。每组测试输入两个整数a、b。

输出格式:
对于每组测试,输出一行,包含一个整数,表示a、b之和。

输入样例:
1 2
3 4
5 6
输出样例:
3
7
11

点击查看代码
try:
    while True: #True要大写
        a,b=input().split()
        c=int(a)+int(b)
        print(c)
except EOFError:pass

例1.6.1 输出乘法式子

输入两个整数,输出如输出样例所示的乘法式子。

输入格式:
输入两个整数a,b。

输出格式:
输出a*b=c,其中a,b是输入的整数,c是a与b的乘积。

输入样例:
2 5
输出样例:
2*5=10

点击查看代码
a,b=input().split()
a=int(a)
b=int(b)
c=a*b
print("%d*%d=%d"%(a,b,c))

例1.6.2 输出漏斗图形

输出如样例输出中所示的漏斗图形。

输入样例:

输出样例:

*********
 *******
  *****
   ***
    *
   ***
  *****
 *******
*********
点击查看代码
n=int(5)
for i in range(2*n-1):
    if i<n:
        for j in range(i):
            print(" ",end="")
        for j in range(2*(n-i)-1):
            print("*",end="")
        print()
    if i>=n:
        for j in range(n-i+3):
            print(" ",end="")
        for j in range(2*(i-n)+3):
            print("*",end="")
        print()

第二章

例2.5.1 求矩形面积

已知一个矩形的长和宽,计算该矩形的面积。矩形的长和宽用整数表示,由键盘输入。

输入格式:
输入在一行中给出2个绝对值不超过1000的整数A和B,表示矩形的长和宽。

输出格式:
在一行中输出矩形的面积。

输入样例:
4 3
输出样例:
12

点击查看代码
a,b=map(int,input().split())
if abs(a)<1000 and abs(b)<1000:
    print(a*b)

例2.5.2 求圆周长和面积

已知一个圆的半径,计算该圆的周长和面积,结果保留2位小数。半径用实数表示,由键盘输入。设圆周率等于3.14159。

输入格式:
输入在一行中给出1个实数r,表示圆的半径。

输出格式:
在一行中输出圆的周长和面积,结果保留2位小数。数据之间留一个空格。

输入样例:
3
输出样例:
18.85 28.27

点击查看代码
r=float(input())
pi=3.14159
c=2*pi*r
s=pi*r**2
print("%0.2f %0.2f"%(c,s))

例2.5.3 温度转换

输入一个华氏温度f(整数),要求根据公式c=5(f-32)/9计算并输出摄氏温度,其中f由键盘输入,结果保留1位小数。

输入格式:
输入在一行中给出1个绝对值不超过1000的整数f,表示华氏温度。

输出格式:
在一行中输出摄氏温度,结果保留1位小数。

输入样例:
100
输出样例:
37.8

点击查看代码
f=int(input())
if abs(f)<1000:
    c=float(5*(f-32)/9)
    print("%0.1f"%c)

例2.5.4 反序显示一个四位数

从键盘上输入一个四位整数,将结果按反序显示出来。

输入格式:
输入在一行中给出1个四位整数a。

输出格式:
在一行中输出a的反序数。

输入样例:
1234
输出样例:
4321

点击查看代码
a=list(input())
a.reverse()
a="".join(a)
print(a)

例2.5.5 交换两实数的整数部分

输入两个实数,将其整数部分交换后输出,结果保留2位小数。

输入格式:
输入2个实数A和B。

输出格式:
输出交换整数部分之后的两个实数。数据之间以一个“,”分隔。

输入样例:
23.45 54.22
输出样例:
54.45,23.22

点击查看代码
a,b=map(float,input().split())
za=int(a)
zb=int(b)
la=a-za
lb=b-zb
fa=zb+la
fb=za+lb
print("%.2f,%.2f"%(fa,fb))

例2.5.6 英文字母的大小写转换

输入一个大写字母c1和一个小写字母c2,把c1转换成小写,c2转换成大写,然后输出。

输入格式:
输入在一行中给出2个字母,第1个是大写字母c1,第2个是小写字母c2。

输出格式:
在一行中输出把c1转换成小写,c2转换成大写后的结果。数据之间留一个逗号。

输入样例:
Y e
输出样例:
y,E

点击查看代码
a,b=input().split()
a=a.lower()
b=b.upper()
print("%s,%s"%(a,b))

习题2.2.1 4位整数的数位和

输入一个4位数的整数,求其各数位上的数字之和。

输入格式:
输入在一行中给出1个4位的正整数n。

输出格式:
在一行中输出n的各数位上的数字之和。

输入样例:
1234
输出样例:
10

点击查看代码
a=input()
sum=0
for i in range(len(a)):
    a=int(a)
    sum+=a%10
    a=a//10
print(sum)

习题2.2.2 5门课的平均分

输入5门课程成绩(整数),求平均分(结果保留1位小数)。

输入格式:
输入在一行中给出5个整数,表示5门课成绩。

输出格式:
在一行中输出5门课的平均分(结果保留1位小数)。

输入样例:
66 77 88 99 79
输出样例:
81.8

点击查看代码
a,b,c,d,e=map(int,input().split())
avg=(a+b+c+d+e)/5
print("%0.1f"%avg)

习题2.2.3 打字

小明1分钟能打m字,小敏1分钟能打n字,两人一起打了t分钟,总共打了多少字。

输入格式:
输入3个整数m,n,t。

输出格式:
输出小明和小敏t分钟一共打的字数。

输入样例:
65 60 2
输出样例:
250

点击查看代码
m,n,t=map(int,input().split())
sum=m*t+n*t
print(sum)

习题2.2.4 欢迎信息

根据输入的姓名(可能包含空格,长度不超过12),输出欢迎信息,即在姓名之前添加“Hello,”。

输入格式:
输入在一行中给出1个字符串s(可能包含空格,长度不超过12),表示输入的姓名。

输出格式:
根据输入的姓名(可能包含空格,长度不超过12),输出欢迎信息,即在姓名s之前添加“Hello,”(参看样例输出)。

输入样例:
Jack
输出样例:
Hello,Jack

点击查看代码
# 二章习题 4
a=input()
print("Hello,"+a)

习题2.2.5 求串长
输入一个字符串(可能包含空格,长度不超过20),输出该串的长度。

输入格式:
输入在一行中给出1个长度不超过20的字符串s。

输出格式:
在一行中输出s的串长。

输入样例:
welcome to acm world
输出样例:
20

点击查看代码
s=input()
print(len(s))

习题2.2.6 求子串

输入一个字符串,输出该字符串的子串。

输入格式:
首先输入一个正整数k,然后是一个字符串s(可能包含空格,长度不超过20),k和s之间用一个空格分开。(k大于0且小于等于s的长度)

输出格式:
在一行中输出字符串s从头开始且长度为k的子串。

输入样例:
10 welcome to acm world
输出样例:
welcome to

点击查看代码
a=input().split()
k=int(a[0])
a=a[1:]
a=list(a)
a=" ".join(a)
a=str(a)
b=a[:k]
print(b)

习题2.2.7 查找字符串

在一行上输入两个字符串s和英文字符串t,要求在s中查找t。其中,字符串s,t均不包含空格,且长度均小于80。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入2个长度不超过80的字符串s和t(s和t都不包含空格)。

输出格式:
对于每组测试数据,若在s中找到t,则输出“Found!”,否则输出“not Found!”。引号不必输出。

输入样例:
2
dictionary lion
factory act
输出样例:
not Found!
Found!

点击查看代码
T=int(input())
for i in range(T):
    s,t =input().split()
    if t in s:
        print('Found!')
    else:
        print('not Found!')

第三章

例3.2.4 成绩转换

百分制成绩转换为五级计分制时,90分以上为A,80~89分为B,70~79分为C,60~69分为D,0~59分为E。请把输入的百分之成绩转换为五级计分制输出。

输入格式:
测试数据有多组,处理到文件尾。每组测试输入一个整数score。

输出格式:
对于每组测试,在一行上输出百分制成绩score对应的字符等级。若score超出百分制范围,则输出“error!”。引号不必输出。

输入样例:
1
61
102
输出样例:
E
D
error!

点击查看代码
try:
    while True:
        score=int(input())
        if score>=90 and score<=100:
            rank='A'
        elif score>=80 and score<90 :
            rank='B'
        elif score>=70 and score<80 :
            rank='C'
        elif score>=60 and score<70 :
            rank='D'
        elif score>=0 and score<60:
            rank='E'
        else:
            rank='error!'
        print(rank)
except EOFError:pass

例3.2.5 求某月的天数

输入年份year、月份month,判断该月的天数。闰年:能被4整除但不能被100整除或者能被400整除的年份是闰年。

输入格式:
测试数据有多组,处理到文件尾。对于每组测试,输入两个整数,表示年份year和月份month。

输出格式:
对于每组测试,输出对应年月的天数。

输入样例:
2020 2
2020 4
输出样例:
29
30

点击查看代码
try:
    while True:
       year,month=map(int,input().split())
       if month==2:
            if year%4==0 and year%100!=0 or year%400==0:
                days=29
            else:
                days=28
       elif month==1 or month==3 or month==5 or month==7 or month==8 or month==10 or month==12:
          days=31
       elif month==4 or month==6 or month==9 or month==11:
          days=30
       print(days)
except EOFError:pass

例3.3.3 亲和数判断

古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:1+2+4+5+10+11+20+22+44+55+110=284。而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们称这样的数对为亲和数。也就是说,若两个数中任何一个数都是另一个数的真约数之和,则它们就是亲和数。请判断输入的两个整数是否是亲和数。

输入格式:
测试数据有多组,处理到文件尾。每组测试输入两个正整数a,b。

输出格式:
对于每组测试,若a,b是亲和数,是则输出“YES”,否则输出“NO”。引号不必输出。

输入样例:
220 284
输出样例:
YES

点击查看代码
try:
    while True:
        a,b=map(int,input().split())
        na=0
        for i in range(1,a//2+1):
            if a%i==0:
                na+=i
        nb=0
        for i in range(1,b//2+1):
            if b%i==0:
                nb+=i
        if na==b and nb==a:
            print('YES')
        else:
            print('NO')
except EOFError:pass

例3.3.4 星号三角形

输入整数n,显示星号构成的三角形。例如,n=6时,显示输出的三角形如样例输出所示。

输入格式:
测试数据有多组,处理到文件尾。每组测试输入一个正整数n(0<n<41)。

输出格式:
对于每组测试,输出n行构成的三角形。

输入样例:
6
输出样例:

     *
    ***
   *****
  *******
 *********
***********

点击查看代码
try:
    while True:
        n=int(input())
        for i in range(n):
            for j in range(n-i-1):
                print(' ',end='')
            for j in range(2*i+1):
                print('*',end='')
            print()
except EOFError:pass

例3.3.5 百钱百鸡

百钱百鸡问题的白话版:100元钱买100只鸡,公鸡5元1只,母鸡3元1只,小鸡1元3只。问公鸡、母鸡、小鸡各多少只(某种鸡可以为0只)?

百钱百鸡的结果如输出样例所示。

现在把100改为n,即n元钱买n只鸡,各种鸡价格不变,结果又如何呢?

输入格式:
测试数据有多组,处理到文件尾。每组测试输入一个整数n(100<=n<=1000)。

输出格式:
对于每组测试,按公鸡、母鸡、小鸡的数量(按公鸡数从小到大的顺序)逐行输出各种买法(每行数据之间空一个空格)。

输入样例:
100
输出样例:
0 25 75
4 18 78
8 11 81
12 4 84

点击查看代码
try:
     while True:
        n=int(input())
        for i in range(n//5+1):
            for j in range(n//3+1):
                k=n-i-j
                if i*5+j*3+k/3==n:
                    print(i,j,k)
except EOFError:pass

例3.3.6 奇数的和

输入n,求[1,n]范围内的所有奇数之和。

输入格式:
测试数据有多组。每组测试数据输入一个整数n(0<n<1000)。若n=0,则输入结束。

输出格式:
对于每组测试,求[1,n]中的奇数之和。

输入样例:
10
9
0
输出样例:
25
25

点击查看代码
while True:
    n=int(input())
    if n==0:
        break
    sum=0
    for i in range(1,n+1):
        if i%2==1:
            sum+=i
    print(sum)

例3.3.7 数位之和

输入一个正整数,求其各个数位上的数字之和。例如,输入12345,输出15。

输入格式:
测试数据有多组,处理到文件尾。每组测试输入一个正整数n(int范围内)。

输出格式:
对于每组测试,输出每个n对应的各位数字和。

输入样例:
12345
输出样例:
15

点击查看代码
try:
     while True:
        n=int(input())
        s=0
        while n>0:
            s+=n%10  #取最后一位
            n//=10   #去除最后一位
        print(s)
except EOFError:pass

例3.3.8 数列求和

求下面数列的所有大于等于精度e的数据项之和,显示输出计算的结果(四舍五入保留6位小数)。
1/2,3/4,5/8,7/16,9/32……

输入格式:
测试数据有多组,处理到文件尾。每组测试输入一个实数e。

输出格式:
对于每组测试,输出数列中所有大于等于e的数据项之和。结果四舍五入保留6位小数。

输入样例:
0.000001
输出样例:
2.999998

点击查看代码
try:
    while True:
        e=float(input())
        a=1
        b=2
        c=a/b
        sum1=0
        while c>=e:
            a=a+2
            b=b*2
            sum1+=c
            c=a/b
        print("%.6f"%sum1)
except EOFError:pass 

例3.3.10、例5.3.1 素数判断

输入一个正整数m,判断该数是否为素数。

输入格式:
首先输入测试组数T,然后输入T组测试数据。每组测试输入一个正整数m。

输出格式:
对于每组测试,若m为素数则输出“yes”;反之输出“no”。注意:引号不必输出。

输入样例:
3
9
3
7
输出样例:
no
yes
yes

点击查看代码
from math import sqrt
T=int(input())
for i in range(T):
    n=int(input())
    flag=True
    if n<2:
        flag=False
    for i in range(2,int(sqrt(n))+1):
        if n%i==0:
            flag=False
            break
    if flag:
        print('yes')
    else:
        print('no')

例3.4.1 平均值

在一行上输入若干整数,每个整数以一个空格分开,求这些整数的平均值。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入一个字符串(仅包含数字字符和空格)。

输出格式:
对于每组测试,输出以空格分隔的所有整数的平均值,结果保留一位小数。

输入样例:
1
1 2 3 4 5 6 7 8 9 10
输出样例:
5.5

点击查看代码
T=int(input())
for i in range(T):
    a=input().split()
    sum1=0
    for i in range(len(a)):
        sum1+=int(a[i])
    avg=sum1/len(a)
    print("%.1f"%avg)

例3.4.2 闰年判断

闰年是能被4整除但不能被100整除或者能被400整除的年份。请判断给定年份是否闰年。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入一个年份y。

输出格式:
对于每组测试,若y是闰年输出“YES”,否则输出“NO”。引号不必输出。

输入样例:
2
2008
1900
输出样例:
YES
NO

点击查看代码
T=int(input())
for i in range(T):
    y=int(input())
    if y%4==0 and y%100!=0 or y%400==0:
        print('YES')
    else:
        print('NO')

例3.4.3、例5.4.1 求n!

image

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入一个正整数n(n≤12)。

输出格式:
对于每组测试,输出整数n的阶乘。

输入样例:
1
5
输出样例:
120

点击查看代码
T=int(input())
for i in range(T):
    n=int(input())
    s=1
    if n>0 and n<=12:
        if n==0 and n==1:
            res=1
        else:
            for i in range(1,n+1):
                s=s*i
                res=s
        print(res)

例3.4.4 统计数字

输入一个字符串,统计其中数字字符的个数。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入一个仅由字母和数字组成的字符串(长度不超过80)。

输出格式:
对于每组测试,在一行上输出该字符串中数字字符的个数。

输入样例:
2
er520ac520
a1c2m3sdf
输出样例:
6
3

点击查看代码
T=int(input())
for i in range(T):
     s=input()
     n=0
     for i in range(len(s)):
        if s[i].isdigit():
            n+=1
     print(n)

例3.4.5 组合数

输入两个正整数n、m,要求输出组合数C(n,m)。
例如,当n=5、m=3时,组合数C(5,3)=(5×4×3)/(3×2×1)=10。
组合数可用以下公式计算:

zuheshu.jpg

输入格式:
测试数据有多组,处理到文件尾。每组测试输入两个整数n,m(0 < m ≤ n ≤ 20)。

输出格式:
对于每组测试,输出组合数。

输入样例:
5 3
20 12
输出样例:
10
125970

点击查看代码
def jiecheng(n):
    if n==0 or n==1:
        return 1
    else:
        s=1
        for i in range(1,n+1):
            s*=i
        return s
try:
    while True:
        n,m=map(int,input().split())  #需要采用map形式
        res=int(jiecheng(n)/(jiecheng(m)*jiecheng(n-m)))
        print(res)
except EOFError:pass  
        

例3.4.6 单词首字母大写

输入一个英文句子,要求将每个单词的首字母改成大写字母。

输入格式:
测试数据有多组,处理到文件尾。每组测试输入一行,包含一个长度不超过100的英文句子(仅包含大小写英文字母和空格),单词之间以一个空格间隔。

输出格式:
对于每组测试,输出按照要求改写后的英文句子。

输入样例:
I like acm
i want to get accepted
输出样例:
I Like Acm
I Want To Get Accepted

点击查看代码
try:
    while True:
        a=input().split()
        for i in range(len(a)):
            if i>0:
              print(" ",end="")
            print(a[i].capitalize(),end="")
        print()    

except EOFError:pass

例3.4.7、例4.1.1 列出完数

输入一个整数n,要求输出[1,n]范围内的所有完数。完数是一个正整数,该数恰好等于其所有不同真因子之和。例如,6、28是完数,因为6=1+2+3,28=1+2+4+7+14;而24不是完数,因为24≠1+2+3+4+6+8+12=36。

输入格式:
测试数据有多组,处理到文件尾。每组测试数据输入一个整数n(1≤n≤10000)。

输出格式:
对于每组测试,首先输出n和一个冒号“:”;然后输出所有不大于n的完数(每个数据之前留一个空格);若[1,n]范围内不存在完数,则输出“NULL”。引号不必输出。具体输出格式参考输出样例。

输入样例:
100
5000
5
输出样例:
100: 6 28
5000: 6 28 496
5: NULL

点击查看代码
try:
    while True:
        n=int(input())
        print(n,end=":")
        if n<6:
            print(" NULL")
        elif n<28:
            print(" 6")
        elif n<496:
            print(" 6 28")
        elif n<8128:
            print(" 6 28 496")
        elif n<=10000:
            print(" 6 28 496 8128")
except EOFError:pass

习题3.2.5 电费

某电价规定:月用电量在150千瓦时及以下部分按每千瓦时0.4463元收费,月用电量在151~400千瓦时的部分按每千瓦时0.4663元收费,月用电量在401千瓦时及以上部分按每千瓦时0.5663元收费。
请编写一个程序,根据输入的月用电量(单位以千瓦时计),按该电价规定计算出应缴的电费(单位以元计)。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。对于每组测试,输入一个整数n(0≤n≤10000),表示月用电量。

输出格式:
对于每组测试,输出一行,包含一个实数,表示应缴的电费。结果保留2位小数。

输入样例:
1
267
输出样例:
121.50

点击查看代码
T=int(input())
for i in range(T):
    n=int(input())
    sum=0
    if n>=0 and n<=10000:
        if n<=150:
            sum=0.4463*n
        elif n<=400:
            sum=0.4663*(n-150)+150*0.4463
        elif n>400 :
            sum=0.5663*(n-400)+250*0.4663+150*0.4463
    print("%0.2f"%sum)

习题3.2.6 小游戏

有一个小游戏,6个人上台去算手中扑克牌点数之和是否5的倍数,据说是小学生玩的。这里稍微修改一下玩法,n个人上台,算手中数字之和是否同时是5,7,3的倍数。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试先输入1个整数n(1≤n≤15),再输入n个整数,每个都小于1000。

输出格式:
对于每组测试,若n个整数之和同时是5,7,3的倍数则输出“YES”,否则输出“NO”。引号不必输出。

输入样例:
2
3 123 27 60
3 23 27 60
输出样例:
YES
NO

点击查看代码
T=int(input())
for i in range(T):
    a=input().split()
    n=a[0]
    a=a[1:]
    sum1=0
    for i in range(len(a)):
        sum1+=int(a[i])
    if sum1%3==0 and sum1%5==0 and sum1%7==0:
        print('YES')
    else:
        print('NO')

习题3.2.7 购物

小明购物之后搞不清最贵的物品价格和所有物品的平均价格,请帮他编写一个程序实现。

输入格式:
测试数据有多组,处理到文件尾。每组测试先输入1个整数n(1≤n≤100),接下来的n行中每行输入1个英文字母表示的物品名及该物品的价格。测试数据保证最贵的物品只有1个。

输出格式:
对于每组测试,在一行上输出最贵的物品名和所有物品的平均价格,两者之间留一个空格,平均价格保留1位小数。

输入样例:
3
a 1.8
b 2.5
c 1.5
输出样例:
b 1.9

点击查看代码
try:
    while True:
        n=int(input())
        s=[]
        for i in range(n):
            t=list(input().split())
            s.append({"name":t[0],"price":float(t[1])})
        max1=0
        sum1=0
        for i in range(n):
            if s[i]['price']>max1:
                max1=s[i]['price']
            sum1+=s[i]['price']
        for i in range(n):
            if s[i]['price']==max1:
                print(s[i]['name'],end=" ")
        avg=0
        avg=sum1/n
        print("%.1f"%avg)
except EOFError:pass

习题3.2.8 等边三角形面积

对于等边三角形面积,请选择合适的方法计算之。

输入格式:
测试数据有多组,处理到文件尾。每组测试输入1个实数表示等边三角形的边长。

输出格式:
对于每组测试,在一行上输出等边三角形的面积,结果保留2位小数。

输入样例:
1.0
2.0
输出样例:
0.43
1.73

点击查看代码
from math import sqrt
try:
    while True:
        a=float(input())
        s=sqrt(3)/4*a**2
        print("%0.2f"%s)
except EOFError:pass

习题3.2.9 三七二十一

某天,诺诺看到三七二十一(3721)数,觉得很神奇,这种数除以3余2,而除以7则余1。例如8是一个3721数,因为8除以3余2,8除以7余1。现在给出两个整数a、b,求区间[a,b]中的所有3721数,若区间内不存在3721数则输出“none”。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入两个整数a,b(1≤a<b<2000)。

输出格式:
对于每组测试,在一行上输出区间[a,b]中所有的3721数,每两个数据之间留一个空格。如果给定区间不存3721数,则输出“none”(引号不必输出)。

输入样例:
2
1 7
1 100
输出样例:
none
8 29 50 71 92

点击查看代码
T=int(input())
for i in range(T):
    a,b=map(int,input().split())
    num=0
    for j in range(a,b+1):
        if j%3==2 and j%7==1:
            num+=1
            if num>1:
                print(" ",end="")
            print(j,end="")    
    if num==0:
        print('none')
    else:
        print()

习题3.2.10 胜者

Sg和Gs进行乒乓球比赛,进行若干局之后,想确定最后是谁胜(赢的局数多者胜)。

输入格式:
测试数据有多组,处理到文件尾。每组测试先输入一个整数n,接下来的n行中每行输入两个整数a,b(0≤a,b≤20),表示Sg与Gs的比分是a比b。

输出格式:
对于每组测试数据,若还不能确定胜负则输出“CONTINUE”,否则在一行上输出胜者“Sg”或“Gs”。引号不必输出。

输入样例:
3
3 11
13 11
11 9
输出样例:
Sg

点击查看代码
try:
    while True:
        n=int(input())
        Sg=0
        Gs=0
        for i in range(n):
            a,b=map(int,input().split())
            if a>b:
                Sg+=1
            if b>a:
                Gs+=1
        if Sg>Gs:
            print('Sg')
        elif Gs>Sg:
            print('Gs')
        else:
            print('CONTINUE')

except EOFError:pass

习题3.2.11 加密

信息安全很重要,特别是密码。给定一个5位的正整数n和一个长度为5的字母构成的字符串s,加密规则很简单,字符串s的每个字符变为它后面的第k个字符,其中k是n的每一个数位上的数字。第一个字符对应n的万位上的数字,最后一个字符对应n的个位上的数字。简单起见,s中的每个字符为ABCDE中的一个。

输入格式:
测试数据有多组,处理到文件尾。每组测试数据在一行上输入非负的整数n和字符串s。

输出格式:
对于每组测试数据,在一行上输出加密后的字符串。

输入样例:
12345 ABCDE
输出样例:
BDFHJ

点击查看代码
try:
    while True:
        a,b=input().split()

        for i in range(5):
            c=chr(ord(b[i])+int(a[i]))
            print(c,end='')
        print()    
        
except EOFError:pass

习题3.2.12 比例

某班同学在操场上排好队,请确定男、女同学的比例。

输入格式:
测试数据有多组,处理到文件尾。每组测试数据输入一个以“.”结束的字符串,串中每个字符可能是“MmFf”中的一个,“m”或“M”表示男生,“f”或“F”表示女生。

输出格式:
对于每组测试数据,在一行上输出男、女生的百分比,结果四舍五入到1位小数。输出形式参照### 输出样例:。

输入样例:
FFfm.
MfF.
输出样例:
25.0 75.0
33.3 66.7

点击查看代码
try:
    while True:
        a=input()
        a=a[:len(a)-1]
        boy=0
        girl=0
        for i in range(len(a)):
            if a[i]=='F' or a[i]=='f':
                girl+=1
            if a[i]=='M' or a[i]=='m':
                boy+=1
        b_percent=boy/len(a)*100
        a_percent=girl/len(a)*100
        print("%0.1f %0.1f"%(b_percent,a_percent))  
except EOFError:pass

习题3.2.13 某校几人

某学校教职工人数不足n人,在操场排队,7个一排剩5人,5个一排剩3人,3个一排剩2人;请问该校人数有多少种可能?最多可能有几人?

输入格式:
测试数据有多组,处理到文件尾。每组测试输入一个整数n(1≤n≤10000)。

输出格式:
对于每组测试,输出一行,包含2个以一个空格间隔的整数,分别表示该校教职工人数的可能种数和最多可能的人数。

输入样例:
1000
输出样例:
9 908

点击查看代码
try:
    while True:
       n=int(input())
       num=0
       for i in range(n,1,-1):
            if i%7==5 and i%5==3 and i%3==2:
                num+=1
       print(num,end=" ")
       for i in range(n,1,-1):
            if i%7==5 and i%5==3 and i%3==2:
                print(i)
                break
except EOFError:pass

习题3.2.14 昨天

例如:日期为2019-10-01,减去1天,则结果日期为2019-09-30。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入1个日期,日期形式为“yyyy-mm-dd”。保证输入的日期合法,而且输入的日期和计算结果都在[1000-01-01,9999-12-31]范围内。

输出格式:
对于每组测试,在一行上以“yyyy-mm-dd”的形式输出结果。

输入样例:
1
2019-10-01
输出样例:
2019-09-30

点击查看代码
T=int(input())
for i in range(T):
    a=input().split("-")
    y=int(a[0])
    m=int(a[1])
    d=int(a[2])
   
    r=0
    if y%400==0 or y%4==0 and y%100!=0:
        r=1
        
    d-=1
    if d==0:
        m-=1
        if m>0 and m<7:
            if m%2==1:
                d=31
            else:
                if m==2:
                    if r==1:
                        d=29
                    else:
                        d=28
                else:
                    d=30
        else:
            if m%2==0:
                d=31
            else:
                d=30
    if m==0:
        m=12
        y-=1
        
    print("%d-%02d-%02d"%(y,m,d))

习题3.2.15 直角三角形面积

已知直角三角形的三边长,求该直角三角形的面积。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组数据输入3个整数a,b,c,代表直角三角形的三边长。

输出格式:
对于每组测试输出一行,包含一个整数,表示直角三角形面积。

输入样例:
2
3 4 5
3 5 4
输出样例:
6
6

点击查看代码
T=int(input())
for i in range(T):
    a=input().split()
    max1=0
    for i in range(len(a)):
        if int(a[i])>max1:
            max1=int(a[i])
    sum1=1
    for i in range(len(a)):
        if int(a[i])<max1:
           sum1*=int(a[i])
    res=sum1//2
    print(res)

习题3.2.16 转向三角形

输入一个整数n,要求用数字1到n排列出一个转向三角形。例如,n=5时,转向三角形如输出样例所示。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入1个整数n(1≤n≤9)。

输出格式:
对于每组测试数据,输出一个有2n-1行的,由数字1…n…1组成的转向三角形(参看输出样例)。

输入样例:
1
5
输出样例:
1
22
333
4444
55555
4444
333
22
1

点击查看代码
T=int(input())
for i in range(T):
    n=int(input())
    for i in range(1,2*n-1+1):
#        print(i)
        if i<=n:
           for j in range(i):
              print(i,end="")
           print()
        elif i>n:
           for j in range(2*n-i):
               print(2*n-i,end="")
           print()

习题3.2.18 字符梯形

用从m到n的数字字符排列出一个字符梯形。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入2个整数m、n(1≤m≤n≤9)。

输出格式:
对于每组测试数据,输出一个有n-m+1行的,由数字m…n排列而成的梯形,每行的长度依次为:m,m+1,m+2,……,n,每行的数字依次是m,m+1,m+2,……,n。

输入样例:
1
3 6
输出样例:
333
4444
55555
666666

点击查看代码
T=int(input())
for i in range(T):
    m,n=map(int,input().split())
    for j in range(n-m+1):
        for k in range(m+j):
            print(m+j,end="")
        print()

习题3.2.19 菱形

输入一个整数n,输出2n-1行构成的菱形,例如,n=5时的菱形如输出样例所示。

输入格式:
测试数据有多组,处理到文件尾。每组测试输入一个整数n(3≤n≤20)。

输出格式:
对于每组测试数据,输出一个共2n-1行的菱形,具体参看输出样例。

输入样例:
5
输出样例:

    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *
点击查看代码
try:
    while True:
        n=int(input())
        if n>=3 and n<=20:
            for i in range(1,2*n-1+1):
                if i<=n:
                   for j in range(n-i):
                       print(' ',end="")
                   for z in range(2*i-1):
                       print('*',end="")
                   print()
                else:
                   for j in range(i-n):
                       print(' ',end="")
                   for z in range(2*n-1-2*(i-n)):  #2*5-1-2*(6-5)=10-1-2=7
                       print('*',end="")
                   print()
             
except EOFError:pass

习题3.2.17 求累加和

输入两个整数n和a,求累加和S=a+aa+aaa+…+aa…a(n个a)之值。
例如,当n=5,a=2时,S=2+22+222+2222+22222=24690。

输入格式:
测试数据有多组,处理到文件尾。每组测试输入两个整数n和a(1≤n,a<10)。

输出格式:
对于每组测试,输出a+aa+aaa+…+aa…a(n个a)之值。

输入样例:
5 3
8 6
输出样例:
37035
74074068

点击查看代码
try:
    while True:
        n,a=map(int,input().split())
        sum1=0
        s=0
        for i in range(n):
            s=s*10+a
            sum1+=s
        print(sum1) 

except EOFError:pass

习题3.2.20 水仙花数

输入两个3位的正整数m,n,输出[m,n]区间内所有的“水仙花数”。所谓“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身。

输入格式:
测试数据由多组,处理到文件尾。每组测试输入两个3位的正整数m,n(100≤m<n≤999)。

输出格式:
对于每组测试,若[m,n]区间内没有水仙花数则输出“none”(引号不必输出),否则逐行输出区间内所有的水仙花数,每行输出的格式具体参看输出样例。

输入样例:
100 150
100 200
输出样例:
none
153=111+555+333

点击查看代码
try:
    while True:
        m,n=map(int,input().split())
        flag=False
        for i in range(m,n+1):
             sum=0
             a=i%10
             b=i//10%10
             c=i//100
             sum=(i%10)**3+(i//10%10)**3+(i//100)**3
             if sum==i:
                 flag=True
                 print("%d=%d*%d*%d+%d*%d*%d+%d*%d*%d"%(i,c,c,c,b,b,b,a,a,a))
        if flag==False:
             print("none")
except EOFError:pass

习题3.2.21 猴子吃桃

猴子第一天摘下若干个桃子,当即吃了2/3,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉2/3,又多吃了一个。以后每天早上都吃了前一天剩下的2/3再多一个。到第n天早上想再吃时,发现只剩下k个桃子了。求第一天共摘了多少桃子。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组数据输入2个正整数n,k(1≤n,k≤15)。

输出格式:
对于每组测试数据,在一行上输出第一天共摘了多少个桃子。

输入样例:
2
2 1
4 2
输出样例:
6
93

点击查看代码
#(重看) 从最后一天反向计算
T=int(input())
for i in range(T):
    n,k=map(int,input().split())
    if n>=1 and k<=15:
        p=k
        for j in range(n-1):
            p=(p+1)*3
        print(p)

习题3.2.22、例5.3.2 最小回文数

若一个数正向看和反向看等价,则称做回文数。例如:6,2552,12321均是回文数。
给出一个正整数n,求比n大的最小的回文数。(n和运算结果均不会超出int类型范围)

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入1个正整数n。

输出格式:
对于每组测试数据,输出比n大的最小回文数。

输入样例:
2
12
123456
输出样例:
22
124421

点击查看代码
T=int(input())
for i in range(T):
    n=int(input())
    for j in range(n+1,2*n+1): #限制范围
        flag=True
        str1=str(j)
        for k in range(len(str1)//2):
            if str1[k]!=str1[len(str1)-k-1]:
                flag=0
                break
        if flag:
            print(j)
            break

习题3.2.23 分解素因子

假设n是一个正整数,它的值不超过1000000,请编写一个程序,将n分解为若干个素数的乘积。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入一个正整数n(1< n ≤1000000)。

输出格式:
每组测试对应一行输出,输出n的素数乘积表示式,式中的素数从小到大排列,两个素数之间用一个“*”表示乘法。若输入的是素数,则直接输出该数。

输入样例:
2
9828
88883
输出样例:
22333713
88883

点击查看代码
from math import sqrt
T=int(input())
for i in range(T):
    n=int(input())
    flag=True
    if n<2:
        flag=False
    for i in range(2,int(sqrt(n))+1):
        if n%i==0:
            flag=False
            break
    if flag:
        print(n)
    else:
        k=2
        while k<=n:
            if n%k==0:
                print(k,end="")
                n=n//k
                if n!=1:
                   print('*',end="")
            else:
                k+=1
        print()

习题3.2.24 Fibonacci分数序列

求Fibonacci分数序列的前n项之和。Fibonacci分数序列的首项为2/1,后面依次是:3/2,5/3,8/5,13/8,21/13……

输入格式:
测试数据由多组,处理到文件尾。每组测试输入一个正整数n(2≤n≤20)。

输出格式:
对于每组测试,输出Fibonacci分数序列的前n项之和。结果保留6位小数。

输入样例:
3
8
15
输出样例:
5.166667
13.243746
24.570091

点击查看代码
try:
    while True:
        n=int(input())
        sum=float(0)
        a=1
        b=2
        for i in range(n):
            sum+=b/a
            c=a   #先得保存a 重要
            a=b
            b=b+c
        print("%0.6f"%sum)
except EOFError:pass

习题3.2.25 n马n担问题

有n匹马,驮n担货,大马驮3担,中马驮2担,两匹小马驮1担,问有大、中、小马各多少匹? (某种马的数量可以为0)

输入格式:
测试数据由多组,处理到文件尾。每组测试输入一个正整数n(8≤n≤1000)。

输出格式:
对于每组测试,逐行输出所有符合要求的大、中、小马的匹数。要求按大马数从小到大的顺序输出,每两个数字之间留一个空格。

输入样例:
20
输出样例:
1 5 14
4 0 16

点击查看代码
try:
    while True:
        n=int(input())
        for i in range(n//3+1):
            for j in range(n//2+1):
                if 3*i+2*j+0.5*(n-i-j)==n:
                    print(i,j,n-i-j)
except EOFError:pass

习题3.2.26 打印沙漏

当n=5时,沙漏图形如输出样例所示。请观察并明确沙漏图形的规律。要求输入一个整数n,输出满足规律的沙漏图形。

输入格式:
测试数据有多组,处理到文件尾。每组测试输入一个整数n(1<n<20)。

输出格式:
对于每组测试,输出满足规律的沙漏图形。

输入样例:
5
输出样例:

*********
 *******
  *****
   ***
    *
   ***
  *****
 *******
*********
点击查看代码
try:
    while True:
        n=int(input())
        i=2*n
#        for i in range(2*n,1):
        while i>1:
            if i>n:
                for j in range(2*n-i):
                    print(' ',end="")
                for k in range(2*(i-n)-1):
                    print('*',end="")
                print()
            else:
                for j in range(i-2):
                    print(' ',end="")
                for k in range(2*n-2*i+3):   #(2*n-1)-2(i-2)
                    print('*',end="")
                print()
            i-=1           
except EOFError:pass

第四章

例4.1.1 均方差

求n个非负整数x1, x2 …… xn(xi为第i个元素)的均方差,公式如下:

image

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据先输入一个整数n(1≤n≤100),再输入n个整数xi(0≤xi≤1000)。

输出格式:
对于每组测试数据,在一行上输出均方差,结果保留5位小数。

输入样例:
2
4 6 7 8 9
10 6 3 7 1 4 8 2 9 11 5
输出样例:
1.11803
3.03974

点击查看代码
from math import sqrt
T=int(input())
for i in range (T):
    a=list(map(int,input().split()))
    n=a[0]
    a=a[1:]
    sum=0
    for j in range(len(a)):
        sum+=a[j]
    avg=sum/len(a)
    
    sum2=0
    for j in range(len(a)):
        sum2+=(a[j]-avg)**2
    S=sqrt(sum2/n)   
    print("%0.5f"%S)
     

例4.2.1 逆序输出

输入n个数,然后把这n个数逆序输出。

输入格式:
测试数据有多组,处理到文件尾。每组测试数据在一行上首先输入整数n,接着输入n(n<=40)个整数。

输出格式:
对于每组测试,逆序输出n个数,每两个数据之间留一个空格。每两组测试数据之间留一个空行。

输入样例:
5 1 2 3 4 5
3 1 2 3
输出样例:
5 4 3 2 1

3 2 1

点击查看代码

try:
    k=0
    while True:
        a=input().split()
        if a!=None:
           k+=1
        #print(k)
        n=int(a[0])
        a=a[1:]
        a=list(a)
        a.reverse()
        if k>1:
           print()
        print(*a)
        
        
       
except EOFError:pass

例4.2.2 数位分离

输入一个正整数n,要求输出其位数,并分别以正序和逆序输出各位数字。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入一个整数n(int范围内)。

输出格式:
对于每组测试数据,输出n的位数,然后分别以正序和逆序输出各位数字,每两个数据之间用一个逗号“,”分隔。

输入样例:
2
12345
246
输出样例:
5,1,2,3,4,5,5,4,3,2,1
3,2,4,6,6,4,2

点击查看代码
T=int(input())
for i in range(T):
    a=int(input())
    b=[0]*10                                  #产生10个0构成的列表
    i=0
    while a>0:
        b[i]=a%10                             #数位分离
        a=a//10
        i+=1
    print(i,end="")
    for j in range(i-1,-1,-1):
        print(",",b[j],sep='',end='')         #输出逗号和数据,以空串为间隔符、结束符
    for j in range(i):
        print(",",b[j],sep='',end='')
    print()   

例4.2.3 约瑟夫环

有n个人围成一圈(编号为1~n),从第1号开始进行1、2、3报数,凡报3者就退出,下一个人又从1开始报数……直到最后只剩下一个人时为止。请问此人原来的位置是多少号?

输入格式:
测试数据有多组,处理到文件尾。每组测试输入一个整数n(5≤n≤100)。

输出格式:
对于每组测试,输出最后剩下那个人的编号。

输入样例:
10
28
69
输出样例:
4
23
68

点击查看代码
try:
    while True:
        n=int(input())
        a=[True]*n
        j=-1
        cnt=0
        m=n
        while m>1:
            j=(j+1)%n
            if a[j]==False:
                continue
            cnt+=1
            if cnt%3==0:
                a[j]=False
                m-=1
        for i in range(n):
            if a[i]==True:
                print(i+1)
                break
except EOFError:pass

例4.2.4 数组循环移位

输入两个整数n和m,再输入n个整数构成一个数列,把前m个数循环移位到数列的右边。

输入格式:
测试数据有多组,处理到文件尾。每组测试数据第一行输入2个正整数n、m(1<=m,n<100),第二行输入n个整数。

输出格式:
对于每组测试数据, 在一行上输出把前m个数循环移位到数列的右边后的数列,每两个数据之间留一个空格。

输入样例:
5 3
1 2 3 4 5
输出样例:
4 5 1 2 3

点击查看代码
try:
    while True:
        a=list(map(int,input().split()))
        b=list(map(int,input().split()))
        n=a[0]
        m=a[1]
        for i in range(m):
            x=b[0]
            for j in range(1,n):
                b[j-1]=b[j]
            b[n-1]=x
        print(*b)

except EOFError:pass

例4.2.5 小者靠前

输入n(1<n<100)个整数到一个数组中,使得其中最小的一个数成为数组的第一个元素(首元素)。若有多个最小者,则首元素仅与最早出现的最小者交换。

输入格式:
测试数据有多组,处理到文件尾。每组测试数据的第一行输入n(1<n<100),第二行输入n个整数。

输出格式:
对于每组测试,输出将这n个整数中最小的数与第一个数对换后的n个整数。

输入样例:
5
5 3 4 1 2
输出样例:
1 3 4 5 2

点击查看代码
try:
    while True:
        n=int(input())
        a=list(map(int,input().split()))
        a_min=min(a)
        for i in range(len(a)):
            if a[i]==a_min:
                a[0],a[i]=a[i],a[0]
#                 b=a[0]
#                 a[0]=a[i]
#                 a[i]=b
        print(*a)


except EOFError:pass

例4.2.6、例4.2.7 选择排序

输入数据个数n及n个整数构成整数序列,要求对该整数序列进行排序,使其按升序排列。

输入格式:
测试数据有多组,处理到文件尾。每组测试输入两行,第一行输入n(1<n<100),第二行输入n个整数。

输出格式:
对于每组测试,在一行上按升序输出这n个整数,每两个数据之间留一个空格。

输入样例:
10
487 3633 410 4977 940 757 124 392 989 4228
输出样例:
124 392 410 487 757 940 989 3633 4228 4977

点击查看代码
#选择排序
try:
    while True:
       n=int(input())
       a=list(map(int,input().split()))
       for i in range(n-1):
           for j in range(i+1,n):
              if a[i]>=a[j]:
                    a[i],a[j]=a[j],a[i]
       print(*a)

except EOFError:pass

例4.2.8 筛选法求素数

输入一个整数n,求n以内的素数。素数指的是除了1和它本身没有其他因子的整数;最小的素数是2,其余的素数都是奇数;素数序列为:2 3 5 7 11 13 17 19……

输入格式:
测试数据有多组,处理到文件尾。对于每组测试,输入一个整数n(1<n<2000)。

输出格式:
对于每组测试,输出n以内的素数。每两个素数之间留一个空格。

输入样例:
19
输出样例:
2 3 5 7 11 13 17 19

点击查看代码
from math import sqrt
try:
    while True:
        n=int(input())
        cnt=0
        for i in range(2,n+1):
           for k in range(2,int(sqrt(i))+1):
              if i%k==0:
                  flag=False
                  break 
           else:
                 flag=True
                 
           if flag:
              cnt+=1
              if cnt>1:
                print(" ",end='')
              print(i,end="")
        print()
except EOFError:pass

例4.3.2 方阵转置

输入一个n×n的方阵,把其转置并输出。

输入格式:
测试数据有多组,处理到文件尾。对于每组测试,第一行输入一个整数n(n≤10),接下来的n行每行输入n个不超过2位的整数。

输出格式:
对于每组测试,输出这n×n矩阵的转置方阵,每行的每两个数据之间留一个空格。

输入样例:
5
5 51 96 80 45
51 57 77 45 47
72 45 58 83 21
0 28 42 72 42
91 61 7 73 66
输出样例:
5 51 72 0 91
51 57 45 28 61
96 77 58 42 7
80 45 83 72 73
45 47 21 42 66

点击查看代码
try:
    while True:
        n=int(input())
        a=[[0]*n]*n
        for i in range(n):
            a[i]=list(map(int,input().split()))
        for i in range(n):
            for j in range(i):
                a[i][j],a[j][i]=a[j][i],a[i][j]
        for i in range(n):
            print(*a[i])
except EOFError:pass

例4.3.3 杨辉三角

输入一个整数n,输出n行的杨辉三角形。例如,n=5,则杨辉三角如输出样例所示。

输入格式:
输入数据有多组,每组1个整数n(1≤n≤10),一直处理到文件结束。

输出格式:
对于每个n,输出n行杨辉三角形。每个数据的输出为5个字符宽度,具体见输出样例。

输入样例:
5
输出样例:

    1
    1    1
    1    2    1
    1    3    3    1
    1    4    6    4    1
点击查看代码
try:
    while True:
        n=int(input())
        a=[[1]*i for i in range(1,n+1)]
        for i in range(2,n):
            for j in range(1,i):
                a[i][j]=a[i-1][j-1]+a[i-1][j]
        for i in range(n):
            for j in range(i+1):
                print("%5d"%a[i][j],end="")
            print()
               
            
        
except EOFError:pass

例4.3.4 两个矩阵之积

输入整数m、p、n,再输入一个m行p列的整数矩阵A和一个p行n列的整数矩阵B,求两个矩阵的乘积AB

输入格式:
测试数据有多组,处理到文件尾。每组测试数据的第一行输入n(1<m,p,n<10),接下来分别输入A矩阵和B矩阵。

输出格式:
对于每组测试,输出m行,每行n个整数,表示AB的结果,每行中每两个数据之间留一个空格。

输入样例:
4 3 2
5 2 4
3 8 2
6 0 4
0 1 6
2 4
1 3
3 2
输出样例:
24 34
20 40
24 32
19 15

点击查看代码
try:
    while True:
        m,p,n=map(int,input().split())
        a=[]
        for i in range(m):
            t=list(map(int,input().split()))
            a.append(t)
        b=[]
        for i in range(p):
            t=list(map(int,input().split()))
            b.append(t)
        c=[[0]*n for i in range(m)]
        for i in range(m):
            for j in range(p):
                for k in range(n):
                    c[i][k]+=a[i][j]*b[j][k]
        for i in range(m):
            print(*c[i])
                
                
            
except EOFError:pass

例4.3.5 蛇形矩阵

蛇形矩阵是由1开始的自然数依次排列成的一个上三角矩阵(参看 输出样例)。要求输入整数n,构造并输出蛇形矩阵。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入一个正整数N(N不大于100)。

输出格式:
对于每组测试,输出一个共有N行的蛇形矩阵。每行的每两个数字之间留一个空格。

输入样例:
在这里给出一组输入。例如:

1
5
输出样例:
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11

点击查看代码
T=int(input())
for i in range(T):
    n=int(input())
    a=[[0]*(n-i) for i in range(n)]
    val=1
    for i in range(n):
        k=0
        for j in range(i,-1,-1):
            a[j][k]=val
            val+=1
            k+=1
    for i in range(n):
        print(*a[i])
 

例4.4.1、例5.5.9、例6.4.3 确定最终排名

某次程序设计竞赛时,最终排名采用的排名规则如下:
根据成功做出的题数(设为solved)从大到小排序,若solved相同则按输入顺序确定排名先后顺序(请结合输出样例)。请确定最终排名并输出。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
每组测试数据先输入1个正整数n(1 ≤ n ≤ 100),表示参赛队伍总数。然后输入n行,每行包括1个字符串s(不含空格且长度不超过50)和1个正整数d(0 ≤d ≤ 15),分别表示队名和该队的解题数量。

输出格式:
对于每组测试数据,输出最终排名。每行一个队伍的信息:排名、队名、解题数量。

输入样例:
1
8
Team22 2
Team16 3
Team11 2
Team20 3
Team3 5
Team26 4
Team7 1
Team2 4
输出样例:
1 Team3 5
2 Team26 4
3 Team2 4
4 Team16 3
5 Team20 3
6 Team22 2
7 Team11 2
8 Team7 1

点击查看代码
from functools import cmp_to_key
class S:
    def __init__(self,id,name,solved):
        self.id=id
        self.name=name
        self.solved=solved
def cmp(a,b):
    if a.solved!=b.solved:
        return b.solved-a.solved
    if a.id!=b.id:
        return a.id-b.id
T=int(input())
for i in range(T):
    n=int(input())
    a=[]
    for i in range(n):
        t=input().split()
        a.append(S(i+1,t[0],int(t[1])))
    a.sort(key=cmp_to_key(cmp))
    
    for i in range(n):
        print(i+1,a[i].name,a[i].solved)
   

例4.4.2、例5.5.8、例6.4.2 解题排行

解题排行榜中,按解题总数生成排行榜。假设每个学生信息仅包括学号、解题总数;要求先输入n个学生的信息;然后按“解题总数”降序排列,若“解题总数”相同则按“学号”升序排列。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
每组测试数据先输入1个正整数n(1 ≤ n ≤ 100),表示学生总数。然后输入n行,每行包括1个不含空格的字符串s(不超过8位)和1个正整数d,分别表示一个学生的学号和解题总数。

输出格式:
对于每组测试数据,输出最终排名信息,每行一个学生的信息:排名、学号、解题总数。每行数据之间留一个空格。注意,解题总数相同的学生其排名也相同。

输入样例:
1
4
0010 200
1000 110
0001 200
0100 225
输出样例:
1 0100 225
2 0001 200
2 0010 200
4 1000 110

点击查看代码
T=int(input())
for i in range(T):
    n=int(input())
    a=[]
    if n>=1 and n<=100:
        for i in range(n):
            card,solved=input().split()
            a.append({"card":card,"solved":int(solved)})

        for i in range(n-1):
            for j in range(n-1-i):
               if a[j]["solved"]<a[j+1]["solved"]:
                        a[j],a[j+1]=a[j+1],a[j]
               elif a[j]["solved"]==a[j+1]["solved"]and a[j]["card"]>a[j+1]["card"]:
                         a[j],a[j+1]=a[j+1],a[j]

        print(1,a[0]["card"],a[0]["solved"])
        r=1
        for i in range(1,n):
            if a[i]["solved"]!=a[i-1]["solved"]:
                r=i+1
            print(r,a[i]["card"],a[i]["solved"])

例4.5.1 统计不同数字字符的个数

输入只包含数字字符的字符串,统计串中不同字符的出现次数。

输入格式:
测试数据有多组,处理到文件尾。对于每组测试,输入一个字符串(不超过80个字符)。

输出格式:
对于每组测试,按字符串中出现字符的ASCII码升序逐个输出不同的字符及其个数(两者之间留一个空格),每组输出之后空一行,输出格式参照输出样例。

输入样例:
12123
输出样例:
1 2
2 2
3 1

点击查看代码
try:
    while True:
       a=input()
       s=[0]*10
       for it in a:
         s[int(it)]+=1
       for i in range(len(s)):
          if s[i]==0:
              continue
          print(i,s[i])
       print()
except EOFError:pass

例4.5.2 判断双对称方阵

对于一个n阶方阵,请判断该方阵是否双对称,即既左右对称又上下对称。若是则输出“yes”,否则输出“no”。例如,样例中,以第2列为界则左右对称,以第2行为界则上下对称,因此输出“yes”。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组数据的第一行输入方阵的阶n(2≤n≤50),接下来输入n行,每行n个整数,表示方阵中的元素。

输出格式:
对于每组测试数据,若该方阵双对称,则输出“yes”,否则输出“no”。注意,引号不必输出。

输入样例:
2
3
1 2 1
3 5 3
1 4 1
3
1 2 1
3 5 3
1 2 1
输出样例:
no
yes

点击查看代码
T=int(input())
for i in range(T):
     n=int(input())
     a=[]
     for i in range(n):
        t=list(map(int,input().split()))
        a.append(t)
     
     flag=True
     for i in range(n//2):
         for j in range(n):
            if a[i][j]!=a[n-i-1][j]:
                flag=False
                break
     if flag==False:
        print('no')
        continue
     
     for j in range(n//2):
         for i in range(n):
            if a[i][j]!=a[i][n-j-1]:
                flag=False
                break
     
     if flag:
        print('yes')
     else:
        print('no')

例4.5.3 可重组相等

如果一个字符串通过字符位置的调整能重组为另一个字符串,就称这两个字符串“可重组相等”。给出两个字符串,请判断它们是否“可重组相等”。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试输入两字符串s和t。

输出格式:
对于每组测试,判断它们是否“可重组相等”,是则输出“Yes”,否则输出“No”。注意,引号不必输出。

输入样例:
1
Oh, yes!
y! O,seh
输出样例:
Yes

点击查看代码
T=int(input())
for i in range(T):
    s=list(input())
    t=list(input())
    s.sort()
    t.sort()
    if s==t:
        print('Yes')
    else:
        print('No')

例4.5.4 二分查找

对于输入的n个整数,先进行升序排序,然后进行二分查找。

输入格式:
测试数据有多组,处理到文件尾。每组测试数据的第一行是一个整数n(1≤n≤100),第二行有n个各不相同的整数待排序,第三行是查询次数m(1≤m≤100),第四行有m个整数待查找。

输出格式:
对于每组测试,分2行输出,第一行是升序排序后的结果,每两个数据之间留一个空格;第二行是查找的结果,若找到则输出排序后元素的位置(从1开始),否则输出0,同样要求每两个数据之间留一个空格。

输入样例:
9
4 7 2 1 8 5 9 3 6
5
10 9 8 7 -1
输出样例:
1 2 3 4 5 6 7 8 9
0 9 8 7 0

点击查看代码

try:
    while True:
        n=int(input())
        s=list(map(int,input().split()))   	#输入数据创建整型列表
        s.sort()                        	#列表排序
        m=int(input())
        t=list(map(int,input().split()))
        print(*s)              			#输出排序结果
        	
        for k in range(m):              	#进行m次二分查找
            if k>0:print(' ',end='')
            x=t[k]                      	#x暂存待查找的数据
            low=0                       	#low指向查找区间的第一个数
            high=n-1                    	#high指向查找区间的最后一个数
            while low<=high:
                mid=(low+high)//2       	#注意用整除//
                if s[mid]==x:           	#待查数据x等于中间数,查找成功
                    print(mid+1,end='')
                    break
                elif x<s[mid]:          	#若待查找数据x小于中间数,则左半区间查找
                    high=mid-1
                else:                           #若待查找数据x大于中间数,则右半区间查找
                    low=mid+1
            else:
                print(0,end='')
        print()
except EOFError:pass

例4.5.5 马鞍点测试

如果矩阵A中存在这样的一个元素A[i][j]满足下列条件:A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素,则称之为该矩阵的一个马鞍点。请编写程序求出矩阵A的马鞍点。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
对于每组测试数据,首先输入2个正整数m、n(1 ≤ m,n ≤ 100),分别表示二维数组的行数和列数。
然后是二维数组的信息,每行数据之间用一个空格分隔,每个数组元素均在int型范围内。简单起见,假设二维数组的元素各不相同,且每组测试数据最多只有一个马鞍点。

输出格式:
对于每组测试数据,若马鞍点存在则输出其值,否则输出“Impossible”。注意,引号不必输出。

输入样例:
1
4 3
6 7 11
2 17 13
4 -2 3
5 9 88
输出样例:
6

点击查看代码
T=int(input())
for t in range(T):
    m,n=map(int,input().split())
    a=[]
    for i in range(m):
        t=list(map(int,input().split()))
        a.append(t)
    k=0
    cnt=0
    for i in range(m):
        for j in range(n):
            if a[i][j]<a[i][k]:
                k=j
        for j in range(m):
            if a[j][k]>a[i][k]:
                break
        else:
            print(a[i][k])
            cnt+=1
            break
    if cnt==0:
        print('Impossible')
        
    
    
    
    
    
    
    
#     m,n=map(int,input().split())
#     a=[]
#     for i in range(m):
#         t=list(map(int,input().split()))
#         a.append(t)
#     #print(a)
#     cnt=0                           	#计数器清0
#     for i in range(m):              	#找到每行数据的最小数,并记录下标到k中
#         k=0
#         for j in range(n):
#             if a[i][j]<a[i][k]:
#                 k=j
#         for j in range(m):          	#若该数不是列中的最大数,则结束循环
#             if a[j][k]>a[i][k]:
#                 break
#         else:                       	#若上一条for语句未执行break,则找到马鞍点
#             print(a[i][k])
#             cnt+=1;
#             break;

#     if cnt==0:                      	#若计数器为0,则不存在马鞍点
#         print("Impossible")

    
##1
#     cnt = 0
#     for i in range(m):
#         x = min(a[i])
#         for j in range(n):
#             if a[i][j] == x : #一行中可能会有多个最小值
#                 maxn = a[i][j]
#                 s = i
#                 for k in range(m):
#                     if a[k][j] > maxn:
#                         maxn = a[k][j]
#                         s = k
#                 if maxn == x:
#                     cnt += 1
#                     #print(s,j)
#                     print(x)
# if cnt == 0:
#     print('impossible')

##2
#     max1=[]  #存储每列的最大值
#     for i in range(n):              	#找到每行数据的最小数,并记录下标到k中
#         max_l=a[0][i]
#         for j in range(m):
#             if a[j][i]>max_l:
#                 max_l=a[j][i]
#         max1.append(max_l)
        
#     t=False
#     for i in range(n):
#         for j in range(m):
#             if a[j][i]==min(a[j]) and a[j][i]==max1[i]:
#                   print(a[j][i])
#                   t=True
#     if t==False:                      	#若计数器为0,则不存在马鞍点
#         print("impossible")
        
# T=int(input())
# for t in range(T):
#     m,n=map(int,input().split())
#     a=[]
#     for i in range(m):
#         t=list(map(int,input().split()))
#         a.append(t)

##3
#     cnt=0                           	#计数器清0
#     for h in a:              	#找到每行数据的最小数,并记录下标到k中
#         k=min(h) 
#         l=h.index(k)
#         if k>=max([hang[h.index(k)]for hang in a]):
#                print(k)
#                cnt+=1
#                break
        
#     if cnt==0:                      	#若计数器为0,则不存在马鞍点
#         print("impossible")

例4.5.6 骑士

在国际象棋中,棋盘的行编号为18,列编号为ah;马以“日”方式行走,根据马在当前棋盘上的位置,请问可以有几种合适的走法。如下图所示,设马(以H表示)在e4位置,则下一步可以走的位置是棋盘中粗体数字标注的8个位置:

1919.png

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入一个字符(ah)和一个整数(18),表示马所在的当前位置。

输出格式:
对于每组测试,输出共有几种走法。

输入样例:
1
e4
输出样例:
8

点击查看代码
# dir=[[2,1],[1,2],[-1,2],[-2,1],[-2,-1],[-1,-2],[1,-2],[2,-1]]
# T=int(input())
# for t in range(T):
#     s=input()                           #包含两个字符的字符串
#     row=int(s[1])               	#行号转换为整数
#     col=ord(s[0])-ord('a')+1    	#列号(小写字母)转换为整数 
#     cnt=0                       	#计数器清0
#     for i in range(len(dir)):	        #扫描方向数组的8个方向,检查可能走的位置是否在棋盘中
#         newRow=row+dir[i][0]	        #计算可能走的新行号
#         newCol=col+dir[i][1]	        #计算可能走的新列号
#         if (newRow>=1 and newRow<=8) and (newCol>=1 and newCol<=8):
#             cnt+=1              	#若可能走的位置在棋盘内,则计数器增1
#     print(cnt)

dir=[[1,2],[1,-2],[2,1],[2,-1],[-1,2],[-1,-2],[-2,1],[-2,-1]]
T=int(input())
for i in range(T):
    s=input()
    row=int(s[1])
    col=ord(s[0])-ord('a')+1
    cnt=0
    for i in range(len(dir)):
        newRow=row+dir[i][0]
        newCol=col+dir[i][1]
        if (newRow>=1 and newRow<=8) and (newCol>=1 and newCol<=8):
            cnt+=1
    print(cnt)

例4.5.8 气球升起来

程序设计竞赛时,赛场升起各色气球多么激动人心呀!志愿者送气球忙得不亦乐乎,观战的某人想知道目前哪种颜色的气球送出最多。

输入格式:
测试数据有多组,处理到文件尾。每组数据先输入一个整数n(0<n≤5000)表示分发的气球总数。接下来输入n行,每行一个表示颜色的字符串(长度不超过20且仅由小写字母构成)。

输出格式:
对于每组测试,输出出现次数最多的颜色。若出现并列的情况,则只需输出ASCII码值最小的那种颜色。

输入样例:
3
pink
red
pink
输出样例:
pink

点击查看代码
try:
    while True:
        n=int(input())
        d={}                            #创建空字典
        for i in range(n):              #进行n次循环
            s=input()                   #输入一个颜色字符串存放于s中
            if s in d.keys():           #若已存在键s,则该键对应的值(出现次数)加1
                d[s]+=1
            else:                       #若原来不存在键s,则插入“键-值”对s:1
                d[s]=1

        maxNum=max(d.values())          #找出最大的值(出现次数)
        res=max(d.keys())               #找出最大的键(颜色)
        for it in d:                    #在字典中找值最大且字典序最小的键
            if d[it]==maxNum and it<res:
                res=it
        print(res)                      #输出结果
except EOFError:pass    

习题4.2.1 部分逆置

输入n个整数,把第i个到第j个之间的全部元素进行逆置,并输出逆置后的n个数。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试先输入三个整数n,i,j(0 < n <= 100,1 ≤ i < j ≤ n),再输入n个整数。

输出格式:
对于每组测试数据,输出逆置后的n个数,要求每两个数据之间留一个空格。

输入样例:
1
7 2 6 11 22 33 44 55 66 77
输出样例:
11 66 55 44 33 22 77

点击查看代码
T=int(input())
for k in range(T):
   a=list(map(int,input().split()))
   n=a[0]
   i=a[1]-1
   j=a[2]-1
   a=a[3:]
   while i<j:
      a[i],a[j]=a[j],a[i]
      i+=1
      j-=1
   print(*a)
    
    

习题4.2.2 保持数列有序

有n个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。

输入格式:
测试数据有多组,处理到文件尾。每组测试先输入两个整数n(1≤n≤100)和x,再输入n个从小到大有序的整数。

输出格式:
对于每组测试,输出插入新元素x后的数列(元素之间留一个空格)。

输入样例:
3 3 1 2 4
输出样例:
1 2 3 4

点击查看代码
try:
    while True:
      a=list(map(int,input().split()))
      n=a[0]
      x=a[1]
      a=a[2:]
      a.append(x)				#x直接放在最后
      a.sort()
      print(*a)
except EOFError:pass    

习题4.2.3 简单的归并

已知数组A和B各有m、n个元素,且元素按值非递减排列,现要求把A和B归并为一个新的数组C,且C中的数据元素仍然按值非递减排列。
例如,若A=(3,5,8,11),B=(2,6,8,9,11,15,20),
则C=(2,3,5,6,8,8,9,11,11,15,20)

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
每组测试数据输入两行,其中第一行首先输入A的元素个数m(1≤m≤100),然后输入m个元素。第2行首先输入B的元素个数n(1≤n≤100),然后输入n个元素。

输出格式:
对于每组测试数据。分别输出将A、B合并后的数组C的全部元素。输出的元素之间以一个空格分隔(最后一个数据之后没有空格)。

输入样例:
1
4 3 5 8 11
7 2 6 8 9 11 15 20
输出样例:
2 3 5 6 8 8 9 11 11 15 20

点击查看代码
T=int(input())
for i in range(T):
    a=list(map(int,input().split()))
    m=a[0]
    b=list(map(int,input().split()))
    n=b[0]
    a=a[1:]
    b=b[1:]
    c=[0]*(m+n)
    c=a+b
    c.sort()
    for i in range(m+n):
        if i>0:
            print(" ",end="")
        print(c[i],end="")
    print()
        
    

习题4.2.4 变换数组元素

变换的内容如下:
(1)将长度为10的数组中的元素按升序进行排序;
(2)将数组的前n个元素换到数组的最后面。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每行测试数据输入1个正整数n(0 < n < 10),然后输入10个整数。

输出格式:
对于每组测试数据,输出变换后的全部数组元素。元素之间以一个空格分隔(最后一个数据之后没有空格)。

输入样例:
1
2 34 37 98 23 24 45 76 89 34 68
输出样例:
34 34 37 45 68 76 89 98 23 24

点击查看代码
T=int(input())
for i in range(T):
     a=list(map(int,input().split()))
     n=a[0]
     a=a[1:]
     #print(a_n)
     a.sort()
     a_n=a[:n]
     c=[0]*(n-1+10)
     c=a[n:]+a_n
     #print(c)
     for i in range(len(c)):
        if i>0:
            print(" ",end="")
        print(c[i],end="")
     print()

习题4.2.5 武林盟主

在传说中的江湖中,各大帮派要选武林盟主了,如果龙飞能得到超过一半的帮派的支持就可以当选,而每个帮派的结果又是由该帮派帮众投票产生的,如果某个帮派超过一半的帮众支持龙飞,则他将赢得该帮派的支持。现在给出每个帮派的帮众人数,请问龙飞至少需要赢得多少人的支持才可能当选武林盟主?

输入格式:
测试数据有多组,处理到文件尾。每组测试先输入一个整数n(1≤n≤20),表示帮派数,然后输入n个正整数,表示每个帮派的帮众人数ai(0<ai≤100)。

输出格式:
对于每组数据输出一行,表示龙飞当选武林盟主至少需要赢得支持的帮众人数。

输入样例:
3 5 7 5
4 6 6 7 5
输出样例:
6
11

点击查看代码
try:
    while True:
        a=input().split()
        #print(a)
        n=a[0]
        a=list(a[1:])
        a.sort()
        s=0
        for i in range(int(n)//2+1):
            s+=(int(a[i])//2+1)
        print(s)
except  EOFError:pass

习题4.2.6 集合A-B

求两个集合的差集。注意,同一个集合中不能有两个相同的元素。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入1行,每行数据的开始是2个整数n(0 < n ≤ 100)和m(0 < m ≤ 100),分别表示集合A和集合B的元素个数,然后紧跟着n+m个元素,前面n个元素属于集合A,其余的属于集合B。每两个元素之间以一个空格分隔。

输出格式:
针对每组测试数据输出一行数据,表示集合A-B的结果,如果结果为空集合,则输出“NULL”(引号不必输出),否则从小到大输出结果,每两个元素之间以一个空格分隔。

输入样例:
2
3 3 1 3 2 1 4 7
3 7 2 5 8 2 3 4 5 6 7 8
输出样例:
2 3
NULL

点击查看代码
T=int(input())
for i in range(T):
      s=list(map(int,input().split()))
      n=s[0]   
      m=s[1] 
      a=s[2:2+n]
      b=s[2+n:2+n+m]
      k=set(a)-set(b)
      if len(k)==0:
            print("NULL")
            continue
      k=list(k)
      k.sort()
      print(*k)

习题4.2.7 又见A+B

输入格式:
多组测试数据,处理到文件尾。每组测试输入两个英文单词表示的数字A、B(0≤A,B≤10)。

输出格式:
对于每组测试,在一行上输出A+B的结果,要求以英文单词表示。

输入样例:
ten ten
one two
输出样例:
twenty
three

点击查看代码
#使用字典
a={"zero":0,"one":1,"two":2,"three":3,"four":4,"five":5,"six":6,"seven":7,
   "eight":8,"nine":9,"ten":10}
b={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"}  #两个10以内的数相加之和的所有可能
try:
    while True:
      x,y=input().split()
      s=a[x]+a[y]
      print(b[s])
except EOFError:pass    

习题4.2.8 简版田忌赛马

田忌与齐王赛马,双方各有n匹马参赛,每场比赛赌注为200两黄金,现已知齐王与田忌的每匹马的速度,并且齐王肯定是按马的速度从快到慢出场,请写一个程序帮助田忌计算他最多赢多少两黄金(若输,则用负数表示)。
简单起见,保证2n匹马的速度均不相同。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
每组测试数据输入3行,第一行是n(1≤n≤100) ,表示双方参赛马的数量,第2行n个正整数,表示田忌的马的速度,第3行n个正整数,表示齐王的马的速度。

输出格式:
对于每组测试数据,输出一行,包含一个整数,表示田忌最多赢多少两黄金。

输入样例:
3
3
92 83 71
95 87 74
2
20 25
21 12
10
1 2 3 24 5 6 7 8 9 12
11 13 15 19 22 34 14 21 44 99
输出样例:
200
400
-1200

点击查看代码
T=int(input())
for i in range(T):
        n=int(input())
        a=list(map(int,input().split()))
        b=list(map(int,input().split()))
        a.sort(reverse=True)
        b.sort(reverse=True)
        max=a[0]+1              #保留田的最大值,给b,避多次比较
        cnt=0                   #计算赢的次数
        for i in range(n):
            for j in range(n):
                if a[i]>b[j]:   #如果田>齐
                    cnt+=1      #个数加1
                    b[j]=max    #避免多次比较
                    break
        print((cnt-(n-cnt))*200) #赢的次数-输的次数

习题4.2.9 魔镜

例如,对于字符串XY,若把Y端接触镜面,则魔镜会把这个字符串变为XYYX;若再用X端接触镜面,则会变成XYYXXYYX。对于一个最终得到的字符串(可能未接触魔镜),请输出没使用魔镜之前,该字符串最初可能的最小长度。

输入格式:
测试数据有多组,处理到文件尾。每组测试输入一个字符串(长度小于100,且由大写英文字母构成)。

输出格式:
对于每组测试数据,在一行上输出一个整数,表示没使用魔镜前,最初字符串可能的最小长度。

输入样例:
XYYXXYYX
XYXX
输出样例:
2
4

点击查看代码
try:
    while True:
        s=input()
        finish=False
        while True:
            n=len(s)
            if n%2!=0:     #排除奇数
                break
            for i in range(n):     #排除不对称的
                if s[i]!=s[n-1-i]: #有不相等,中断
                    finish=True
                    break
            else:
                s=s[:n//2]         #对称的话,字符串减半
            if finish==True:    #如果没有这个,就会一直循环下去
               break
        print(n)

except EOFError:pass

习题4.2.10 并砖

工地上有n堆砖,每堆砖的块数分别是m1,m2,……mn,每块砖的重量都为1,现要将这些砖通过n-1次的合并(每次把两堆砖并到一起),最终合成一堆。若将两堆砖合并到一起消耗的体力等于两堆砖的重量之和,请设计最优的合并次序方案,使消耗的体力最小。

输入格式:
测试数据有多组,处理到文件尾。每组测试先输入一个整数n(1≤n≤100),表示砖的堆数;然后输入n个整数,分别表示各堆砖的块数。

输出格式:
对于每组测试,在一行上输出采用最优的合并次序方案后体力消耗的最小值。

输入样例:
7 8 6 9 2 3 1 6
输出样例:
91

点击查看代码
try:
    while True:
        s=list(map(int,input().split()))
        n=s[0]
        s=s[1:]
        sum1=0
        for i in range(1,n):  
            s.sort()
            sum1+=s[0]+s[1]
            s.append(s[0]+s[1])
            s=s[2:]
        print(sum1)     
except EOFError:pass

习题4.2.11 判断回文串

若一个串正向看和反向看等价,则称做回文串。例如:t,abba,xyzyx均是回文串。
给出一个长度不超过60的字符串,判断是否是回文串。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每行输入一个长度不超过60的字符串(串中不包含空格)。

输出格式:
对于每组测试数据,判断是否是回文串,若是输出“Yes”,否则输出“No”。引号不必输出。

输入样例:
2
abba
abc
输出样例:
Yes
No

点击查看代码
T=int(input())
for i in range(T):
        s=input()
        n=len(s)
        for i in range(n//2):
            if s[i]!=s[n-1-i]:
                print("No")
                break             #有不相等的就不再往下循环
        else:                     #要在整个for循环上else
           print("Yes")
       
            

习题4.2.12 统计单词

输入长度不超过80的英文文本,统计该文本中长度为n的单词总数(单词之间只有一个空格)。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
每组数据首先输入1个正整数n(1≤n≤50),然后输入1行长度不超过80的英文文本(只含英文字母和空格)。注意:不要忘记在输入一行文本前吸收换行符。

输出格式:
对于每组测试数据,输出长度为n的单词总数。

输入样例:
2
5
hello world
5
acm is a hard game
输出样例:
2
0

点击查看代码
T=int(input())
for i in range(T):
    n=int(input())
    s=input().split()
    sum1=0
    for i in range(len(s)):
        if len(s[i])==n:
            sum1+=1
    print(sum1)

习题4.2.13 删除重复元素

对于给定的数列,要求把其中的重复元素删去再从小到大输出。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据先输入一个整数n(1≤n≤100),再输入n个整数。

输出格式:
对于每组测试,从小到大输出删除重复元素之后的结果,每两个数据之间留一个空格。

输入样例:
1
10 1 2 2 2 3 3 1 5 4 5
输出样例:
1 2 3 4 5

点击查看代码
T=int(input())
for i in range(T):
    a=list(map(int,input().split()))
    n=a[0]
    a=a[1:]
    cnt=0
    for i in sorted(set(a)):
        cnt+=1
        if cnt>1:
            print(" ",end="")
        print(i,end="")
    print()   

习题4.2.14 缩写期刊名

现对于给定的期刊名,要求按以下规则缩写:
(1)长度不超过4的单词不必缩写;
(2)长度超过4的单词仅取前4个字母,但其后要加“.”;
(3)所有字母都小写。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
每组测试输入一个包含大小写字母和空格的字符串(长度不超过85),单词由若干字母构成,单词之间以一个空格间隔。

输出格式:
对于每组测试,在一行上输出缩写后的结果,单词之间以一个空格间隔。

输入样例:
2
Ad Hoc Networks
IEEE Transactions on Nanotechnology
输出样例:
ad hoc netw.
ieee tran. on nano.

点击查看代码
T=int(input())
for i in range(T):
    a=input().split()
    for i in range(len(a)):
        a[i]=a[i].lower()
        if len(a[i])>4:
            a[i]=a[i][0:4]+'.'
    print(*a)
        
        
        
## 第二种书写方式
#         a[i]=a[i].lower()
#         if len(a[i])>4:
#             a[i]=a[i][0:4]+"."
#     print(*a)
            

习题4.2.15、例5.5.6 按长度排序

输入一个整数N及N个整数,要求对给定的N个整数进行排序:先按长度排(短的在前),如长度一样则按大小排(小的在前)。

输入格式:
测试数据有多组。每组测试数据的第一行输入一个整数N(0<N<100),接下来的N行每行输入一个非负整数(最多可达80位)。当N等于0时,输入结束。

输出格式:
对于每组测试,输出排序后的结果,每个数据占一行。每两组测试数据之间留一个空行。

输入样例:
3
123
12
3333
5
1111
2012123123123123122133333
1000
333333333
12
0
输出样例:
12
123
3333

12
1000
1111
333333333
2012123123123123122133333

点击查看代码
num=0
while True:
    n=int(input())
    if n==0:
        break
    num+=1
    if num!=1:
        print() 
    a=[]
    for i in range(n):
        s=int(input())
        a.append(s)
    a.sort()
    for i in range(n):
        print(a[i])
    
   
        

习题4.2.16 统计字符个数

输入若干的字符串,每个字符串中只包含数字字符和大小写英文字母,统计字符串中有出现的不同字符的出现次数。

输入格式:
测试数据有多组,处理到文件尾。每组测试输入一个字符串(不超过80个字符)。

输出格式:
对于每组测试,按字符串中有出现的字符的ASCII码升序逐行输出不同的字符及其个数(两个数据之间留一个空格),每两组测试数据之间留一空行,输出格式参照输出样例。

输入样例:
12123
A1c1B
输出样例:
1 2
2 2
3 1

1 2
A 1
B 1
c 1

点击查看代码
try:
    num=0
    while True:
        s=list(input())
        num+=1
        d={}
        s.sort()
        for i in range(len(s)):
            if s[i] in d.keys():
                 d[s[i]]+=1
            else:
                 d[s[i]]=1
        if num>1:
            print()
        for i,v in d.items():
            print(i,v)

except EOFError:pass    

习题4.2.18 计算天数

根据输入的日期,计算该日期是该年的第几天。

输入格式:
测试数据有多组,处理到文件尾。每组测试输入一个具有格式“Mon DD YYYY”的日期。其中,Mon是一个3个字母表示的月份,DD是一个2位整数表示的日份,YYYY是一个4位整数表示的年份。
提示:闰年则是指该年份能被4整除而不能被100整除或者能被400整除。1-12月份分别表示为:Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec。

输出格式:
对于每组测试,计算并输出该日期是该年的第几天。

输入样例:
Oct 26 2003
输出样例:
299

点击查看代码
month=['',"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
day=[0,31,28,31,30,31,30,31,31,30,31,30,31]
try:
     while True:
            s=input().split()
            d=int(s[1])
            m=month.index(s[0])
            y=int(s[2])
            
            days=d
            for i in range(1,m):
               days+=day[i]
            if m>2 and (y%400==0 or y%4==0 and y%100!=0):
                days+=1
            print(days)
except EOFError:pass


习题4.2.19 判断对称方阵

输入一个整数n及一个n阶方阵,判断该方阵是否以主对角线对称,输出“Yes”或“No”。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组数据的第一行输入一个整数n(1<n<100),接下来输入n阶方阵(共n行,每行n个整数)。

输出格式:
对于每组测试,若该方阵以主对角线对称,则输出“Yes”,否则输出“No”。引号不必输出。

输入样例:
1
4
1 2 3 4
2 9 4 5
3 4 8 6
4 5 6 7
输出样例:
Yes

点击查看代码
T=int(input())
for i in range(T):
    n=int(input())
    a=[]
    flag=True
    for i in range(n):
        t=list(map(int,input().split()))
        a.append(t)
    for i in range(n): #判断是否按主对角线对称
        for j in range(i):
            if a[i][j]!=a[j][i]:
                flag=False
                break
        if flag==False:
            break
    if flag:
        print('Yes')
    else:
        print('No')

习题4.2.20 成绩排名

对于n个学生m门课程的成绩,按平均成绩从大到小输出学生的学号(不处理那些有功课不及格的学生),对于平均成绩相同的情况,学号小的排在前面。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组数据首先输入2个正整数n,m(1≤n≤50,1≤m≤5),表示有n个学生和m门课程,然后是n行m列的整数,依次表示学号从1到n的学生的m门课程的成绩。

输出格式:
对于每组测试,在一行内按平均成绩从大到小输出没有不及格课程的学生学号(每两个学号之间留一空格)。若无满足条件的学生,则输出“NULL”(引号不必输出)。

输入样例:
1
4 3
60 60 61
60 61 60
77 78 29
60 62 60
输出样例:
4 1 2

点击查看代码
from functools import cmp_to_key
class S:
    def __init__(self,id1,avg):
        self.id1=id1
        self.avg=avg
def cmp(a,b):
    if a.avg!=b.avg:
        return b.avg-a.avg
    else:
        return a.id1-b.id1
T=int(input())
for i in range(T):
    n,m=map(int,input().split())
    a=[]
    flag=True
    for i in range(n):
        t=list(map(int,input().split()))
        s=0
        for j in range(m):
            if t[j]<60:
                flag=False
                break
            s+=t[j]
        else:
           a.append(S(i+1,s/m))
    a.sort(key=cmp_to_key(cmp))
    for i in range(len(a)):
        if i>0:
            print(" ",end="")
        print(a[i].id1,end="")    
            

习题4.2.21 找成绩

给定n个同学的m门课程成绩,要求找出总分排列第k名(保证没有相同总分)的同学,并依次输出该同学的m门课程的成绩。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试包含两部分,第一行输入3个整数n、m和k(2≤n≤10,3≤m≤5,1≤k≤n);接下来的n行,每行输入m个百分制成绩。

输出格式:
对于每组测试,依次输出总分排列第k的那位同学的m门课程的成绩,每两个数据之间留一空格。

输入样例:
1
7 4 3
74 63 71 90
98 68 83 62
90 55 93 95
68 64 93 94
67 76 90 83
56 51 87 88
62 58 60 81
输出样例:
67 76 90 83

点击查看代码
T=int(input())
for i in range(T):
    a=list(map(int,input().split()))
    n=a[0]
    m=a[1]
    k=a[2]
    b=[]
    for i in range(n):
        t=list(map(int,input().split()))
        b.append(t)
    c=[]
    for i in range(n):
        s=0
        for j in range(m):
            s+=b[i][j]
        else: 
            c.append({"id":i,"score":s})
    #print(c)
    for i in range(n-1):                                            #冒泡排序
       for j in range(n-1-i):
            if (c[j]["score"]<c[j+1]["score"]):                     #从大到小排列
                c[j],c[j+1]=c[j+1],c[j]                             #交换相邻的两个元素
    #print(c)
    id_k=c[k-1]["id"]  #k是3,对应的坐标是2
    for j in range(m):
        if j>0:
            print(" ",end="")
        print(b[id_k][j],end="")
    print()
    
            

习题4.2.22 最值互换

给定一个n行m列的矩阵,请找出最大数与最小数并交换它们的位置。若最大或最小数有多个,以最前面出现者为准(矩阵以行优先的顺序存放,请参照样例)。

输入格式:
测试数据有多组,处理到文件尾。每组测试数据的第一行输入2个整数n,m(1<n,m<20),接下来输入n行数据,每行m个整数。

输出格式:
对于每组测试数据,输出处理完毕的矩阵(共n行,每行m个整数),每行中每两个数据之间留一个空格。具体参看输出样例。

输入样例:
3 3
4 9 1
3 5 7
8 1 9
输出样例:
4 1 9
3 5 7
8 1 9

点击查看代码
try:
    while True:
        a=list(map(int,input().split()))
        n=a[0]
        m=a[1]
        b=[]
        for i in range(n):
            t=list(map(int,input().split()))
            b.append(t)

        maxr=maxc=minr=minc=0
        for i in range(n):          #m范围小,在前,n范围大,在后,查找最大、最小数的位置
            for j in range(m):
                if b[i][j]>b[maxr][maxc]:
                    maxr,maxc=i,j
                if b[i][j]<b[minr][minc]:
                    minr,minc=i,j
        b[maxr][maxc],b[minr][minc]=b[minr][minc],b[maxr][maxc]

        for i in range(n):          #输出
                print(*b[i])
except EOFError:pass

习题4.2.23 构造矩阵

当n=3时,所构造的矩阵如输出样例所示。观察该矩阵,相信你能找到规律。现在,给你一个整数n,请构造出相应的n阶矩阵。

输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入一个正整数n(n≤20)。

输出格式:
对于每组测试,逐行输出构造好的矩阵,每行中的每个数字占5个字符宽度。

输入样例:
1
3
输出样例:
4 2 1
7 5 3
9 8 6

点击查看代码
T=int(input())
for i in range(T):
    n=int(input())
    a=[[0]*n for i in range(n)] 
    val=1
    for i in range(n-1,-1,-1):      #从第一行的最后一列开始往右下侧填,再往左到第一列
        col=i
        for j in range(n-i):
            a[j][col]=val
            val+=1
            col+=1
    for i in range(1,n):            #从第二行的第一列开始往右下侧填,再往下到最后一行
        row=i
        for j in range(n-i):
            a[row][j]=val
            val+=1
            row+=1
    for i in range(n):
        for j in range(n):
            print("%5d" % a[i][j],end='')
        print()
posted @ 2022-05-01 19:37  Trouvaille_fighting  阅读(5162)  评论(0编辑  收藏  举报