【总结一下|PTA】浙大版《Python 程序设计》题目集_浙江大学pta-程序员宅基地

技术标签: python  总结  

前言

Hello!小伙伴!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
 
自我介绍 ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,有幸拿过一些国奖、省奖…已保研。目前正在学习C++/Linux/Python
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!
 
初学Python 小白阶段
文章仅作为自己的学习笔记 用于知识体系建立以及复习
题不在多 学一题 懂一题
知其然 知其所以然!

第1章

1-1 从键盘输入两个数,求它们的和并输出 (30 分)

题目

本题目要求读入2个整数A和B,然后输出它们的和。

输入格式:

在一行中给出一个被加数
在另一行中给出一个加数

输出格式:

在一行中输出和值。

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

18
-48

输出样例:
在这里给出相应的输出。例如:

-30

解答

a=int(input())
b=int(input())
print(a+b)

在这里插入图片描述

1-2 从键盘输入三个数到a,b,c中,按公式值输出 (30 分)

题目

在同一行依次输入三个值a,b,c,用空格分开,输出 bb-4a*c的值

输入格式:

在一行中输入三个数。

输出格式:

在一行中输出公式值。

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

3 4 5

输出样例:
在这里给出相应的输出。例如:

-44

解答

a,b,c = map(int,input().split())
print(b*b - 4*a*c)

在这里插入图片描述

1-3 输出“人生苦短,我学Python” (10 分)

题目

输入格式:

输出格式:

人生苦短,我学Python

输入样例:

输出样例:

人生苦短,我学Python

解答

l='人生苦短,我学Python'
print(l)

在这里插入图片描述

第二章习题

2-1 计算 11+12+13+…+m (30 分)

题目

输入一个正整数m(20<=m<=100),计算 11+12+13+…+m 的值。

输入格式:

在一行输入一个正整数m。

输出格式:

在一行中按照格式“sum = S”输出对应的和S.

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

90

输出样例:
在这里给出相应的输出。例如:

sum = 4040

解答

m=int(input())
res=sum(list(range(11,m+1)))
print("sum =",res)

在这里插入图片描述

2-2 计算分段函数[1] (10 分)

题目

本题目要求计算下列分段函数_f_(x)的值:
在这里插入图片描述

输入格式:

输入在一行中给出实数x。

输出格式:

在一行中按“f(x) = result”的格式输出,其中x与result都保留一位小数。

输入样例1:

10

输出样例1:

f(10.0) = 0.1

输入样例2:

0

输出样例2:

f(0.0) = 0.0

解答

提交代码-1

x=float(input())
if x==0:
    print("f({:.1f}) = {:.1f}".format(x,x))
else:
    print("f({:.1f}) = {:.1f}".format(x,1/x))

在这里插入图片描述
提交代码-2

x=float(input())
if x==0:
    print('f(%.1f) = %.1f'%(x,x))
else:
    print('f(%.1f) = %.1f' % (x, 1/x))

2-3 阶梯电价 (15 分)

题目

为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。

输入格式:

输入在一行中给出某用户的月用电量(单位:千瓦时)。

输出格式:

在一行中输出该用户应支付的电费(元),结果保留两位小数,格式如:“cost = 应付电费值”;若用电量小于0,则输出"Invalid Value!"。

输入样例1:

10

输出样例1:

cost = 5.30

输入样例2:

100

输出样例2:

cost = 55.50

解答

m=int(input())
if m<0:
    print("Invalid Value!")
elif m<=50:
    cost=m*0.53
    print("cost = {:.2f}".format(cost))
else:
    cost=50*0.53+(m-50)*(0.53+0.05)
    print("cost = {:.2f}".format(cost))

在这里插入图片描述

2-4 特殊a串数列求和 (20 分)

题目

给定两个均不超过9的正整数_a_和_n_,要求编写程序求_a_+aa+aaa++⋯+aa_⋯_an_个_a)之和。

输入格式:

输入在一行中给出不超过9的正整数a和n。

输出格式:

在一行中按照“s = 对应的和”的格式输出。

输入样例:

2 3

输出样例:

s = 246

解答

a,n=map(int,input().split())
num=0
sum=0
for i in range(1,n+1):
    num=num*10+a
    sum+=num
print("s =",sum)

在这里插入图片描述

2-5 求奇数分之一序列前N项和 (15 分)

题目

本题要求编写程序,计算序列 1 + 1/3 + 1/5 + … 的前N项之和。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。

输入样例:

23

输出样例:

sum = 2.549541

解答

n=int(input())
sum=0
for i in range(1,2*n,2):
    sum+=1/i
print("sum = {:.6f}".format(sum))

在这里插入图片描述

2-6 求交错序列前N项和 (15 分)

题目

本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+… 的前N项之和。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中输出部分和的值,结果保留三位小数。

输入样例:

5

输出样例:

0.917

解答

n=int(input())
sum=0
for i in range(1,n+1):
    if i%2==0:
        sum-=(i/(2*i-1))
    else:
        sum+=(i/(2*i-1))
print("{:.3f}".format(sum))

在这里插入图片描述

2-7 产生每位数字相同的n位数 (30 分)

题目

读入2个正整数A和B,1<=A<=9, 1<=B<=10,产生数字AA…A,一共B个A

输入格式:

在一行中输入A和B。

输出格式:

在一行中输出整数AA…A,一共B个A

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

1, 5

输出样例1:
在这里给出相应的输出。例如:

11111

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

3 ,4

输出样例2:
在这里给出相应的输出。例如:

3333

解答

a,b=map(int,input().split(','))
res=0
for i in range(1,b+1):
    res=(res*10)+a
print(res)

在这里插入图片描述

2-8 转换函数使用 (30 分)

题目

输入一个整数和进制,转换成十进制输出

输入格式:

在一行输入整数和进制

输出格式:

在一行十进制输出结果

输入样例:

在这里给出一组输入。例如:
45,8

输出样例:

在这里给出相应的输出。例如:
37

解答

提交代码-1

m,n=map(int,input().split(','))
count=0
ans=0
while(m>0):
    ans=ans+(m%10)*pow(n,count)
    count=count+1
    m=int(m/10)
print(int(ans))

在这里插入图片描述
提交代码-2

m,n=input().split(',')
ans=int(m,int(n))
print(ans)

2-9 比较大小 (10 分)

题目

本题要求将输入的任意3个整数从小到大输出。

输入格式:

输入在一行中给出3个整数,其间以空格分隔。

输出格式:

在一行中将3个整数从小到大输出,其间以“->”相连。

输入样例:

4 2 8

输出样例:

2->4->8

解答

提交代码 - 1

a,b,c=map(int,input().split())
if(a>b):
    temp=a
    a=b
    b=temp
if(a>c):
    temp=a
    a=c
    c=temp
if(b>c):
    temp=b
    b=c
    c=temp
print("%d->%d->%d" %(a,b,c))

在这里插入图片描述
提交代码 - 2

print(*sorted(map(int,input().split())),sep="->")

提交代码 - 3

#!/usr/bin/python3
print(*sorted(map(int,input().split(','))),sep="->")

2-10 输出华氏-摄氏温度转换表 (15 分)

题目

输入2个正整数lower和upper(lower≤upper≤100),请输出一张取值范围为[lower,upper]、且每次增加2华氏度的华氏-摄氏温度转换表。
温度转换的计算公式:C=5×(_F_−32)/9,其中:_C_表示摄氏温度,_F_表示华氏温度。

输入格式:

在一行中输入2个整数,分别表示lower和upper的值,中间用空格分开。

输出格式:

第一行输出:“fahr celsius”
接着每行输出一个华氏温度fahr(整型)与一个摄氏温度celsius(占据6个字符宽度,靠右对齐,保留1位小数)。
若输入的范围不合法,则输出"Invalid."。

输入样例1:

32 35

输出样例1:

fahr celsius
32 0.0
34 1.1

输入样例2:

40 30

输出样例2:

Invalid.

解答

#!/usr/bin/python3
m,n=map(int,input().split())
if(n<m):
    print('Invalid.')
else:
    print('fahr celsius')
    for i in range(m,n+1,2):
        print("{:d}{:>6.1f}".format(i,5*(i-32)/9))
    

在这里插入图片描述

2-11 求平方与倒数序列的部分和 (15 分)

题目

在这里插入图片描述

输入格式:

输入在一行中给出两个正整数m和n(m≤n),其间以空格分开。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后六位。题目保证计算结果不超过双精度范围。

输入样例:

5 10

输出样例:

sum = 355.845635

解答

提交代码 - 1

m,n=map(int,input().split())
sum=0
for i in range(m,n+1):
    sum=sum+i*i+1/i
print("sum = {:.6f}".format(sum))

在这里插入图片描述
提交代码 - 2

m,n=map(int,input().split())
print("sum = %.6f"% sum([(m*m+1/m) for m in range(m,n+1)]))

2-12 输出三角形面积和周长 (15 分)

题目

本题要求编写程序,根据输入的三角形的三条边_a_、bc,计算并输出面积和周长。注意:在一个三角形中, 任意两边之和大于第三边。三角形面积计算公式:area=√_s_(s_−_a)(s_−_b)(s_−_c),其中_s_=(a+b+c)/2。
在这里插入图片描述
输入格式:

输入为3个正整数,分别代表三角形的3条边a、b、c。

输出格式:

如果输入的边能构成一个三角形,则在一行内,按照
area = 面积; perimeter = 周长
的格式输出,保留两位小数。否则,输出
These sides do not correspond to a valid triangle

输入样例1:

5 5 3

输出样例1:

area = 7.15; perimeter = 13.00

输入样例2:

1 4 1

输出样例2:

These sides do not correspond to a valid triangle

解答

a,b,c=map(int,input().split())
if(a+b<=c or a+c<=b or b+c<=a):
    print("These sides do not correspond to a valid triangle")
else:
    s=(a+b+c)/2
    print("area = {:.2f}; perimeter = {:.2f}".format((s*(s-a)*(s-b)*(s-c))**0.5,a+b+c))

在这里插入图片描述

2-13 分段计算居民水费 (10 分)

题目

为鼓励居民节约用水,自来水公司采取按用水量阶梯式计价的办法,居民应交水费_y_(元)与月用水量_x_(吨)相关:当_x_不超过15吨时,y=4_x_/3;超过后,y=2.5_x_−17.5。请编写程序实现水费的计算。

输入格式:

输入在一行中给出非负实数x。

输出格式:

在一行输出应交的水费,精确到小数点后2位。

输入样例1:

12

输出样例1:

16.00

输入样例2:

16

输出样例2:

22.50

解答

m=float(input())
if(m<=15):
    print("{:.2f}".format((4*m)/3))
else:
    print("{:.2f}".format(2.5*m-17.5))

在这里插入图片描述

2-14 求整数段和 (15 分)

题目

给定两个整数_A_和_B_,输出从_A_到_B_的所有整数以及这些数的和。

输入格式:

输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。

​输出格式:

首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字占5个字符宽度,向右对齐。最后在一行中按Sum = X的格式输出全部数字的和X。

输入样例:
-3 8

输出样例:

-3 -2 -1 0 1
2 3 4 5 6
7 8 Sum = 30

解答

a,b=map(int,input().split())
sum=0
count=0
for i in range(a,b+1):
    print("{:>5d}".format(i),end="")
    sum+=i
    count=count+1
    if(count==5):
        print("\n",end="")
        count=0
    elif(i==b):
        print("\n",end="")
print("Sum = {:d}".format(sum))

在这里插入图片描述

第三章习题

3-1 大于身高的平均值 (10 分)

题目

中小学生每个学期都要体检,要量身高,因为身高可以反映孩子的生长状况。现在,一个班的身高已经量好了,请输出其中超过平均身高的那些身高。程序的输入为一行数据,其中以空格分隔,每个数据都是一个正整数。程序要输出那些超过输入的正整数的平均数的输入值,每个数后面有一个空格,输出的顺序和输入的相同。

输入格式:

在一行输入中一个班的身高值,以空格分隔。

输出格式:

在一行输出超过输入的平均数的输入值,以空格分隔。

输入样例:

在这里给出一组输入。例如:
143 174 119 127 117 164 110 128

输出样例:

在这里给出相应的输出。例如:
143 174 164

解答

grades=list(map(int,input().split()))
sum=0
for i in grades:
    sum+=i
average_grade=sum/len(grades)
for i in grades:
    if(i>average_grade):
        print("{:d} ".format(i),end="")

image.png

3-2 查验身份证 (15 分)

题目

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:

首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2

现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。

输入格式:

输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。

输出格式:

按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed。

输入样例1:

4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X

输出样例1:

12010X198901011234
110108196711301866
37070419881216001X

输入样例2:

2
320124198808240056
110108196711301862

输出样例2:

All passed

解答

def judge(id,weight,checkCode):
    sum=0
    index=0#辅助索引
    # 前17位
    freWords=id[:17]
    # 第18位上的字符
    lastWord=id[-1]
    for i in freWords:
        if(i<'0' or i>'9'):
            return False
        else:
            sum=sum+weight[index]*int(i)
            index=index+1
    sum=sum%11
    if checkCode[sum] == lastWord:
        return True
    else:
        return False
    
m=int(input())
# 统计正确身份证号码的数量
count=0
# 权重
weight=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
# 校验码
checkCode=['1','0','X','9','8','7','6','5','4','3','2']

for i in range(m):
    id=input()
    if judge(id,weight,checkCode) == False:
        print(id)
    else:
        count=count+1
if(count == m):
    print("All passed")

image.png

3-3 输出字母在字符串中位置索引 (20 分)

题目

输入一个字符串,再输入两个字符,求这两个字符在字符串中的索引。

输入格式:

第一行输入字符串
第二行输入两个字符,用空格分开。

输出格式:

从右向左输出字符和索引,即下标最大的字符最先输出。每行一个。

输入样例:

在这里给出一组输入。例如:
pmispsissippi s p

输出样例:

在这里给出相应的输出。例如:
11 p
10 p
8 s
7 s
5 s
4 p
3 s
0 p

解答

str=input()
s1,s2=input().split()
count=len(str)-1
while count>=0:
    if str[count]==s1 or str[count]==s2:
        print("{:d} {:s}".format(count,str[count]))
    count=count-1

image.png

3-4 查找指定字符 (15 分)

题目

本题要求编写程序,从给定字符串中查找某指定的字符。

输入格式:

输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。

输出格式:

如果找到,在一行内按照格式“index = 下标”输出该字符在字符串中所对应的最大下标(下标从0开始);否则输出"Not Found"。

输入样例1:

m
programming

输出样例1:

index = 7

输入样例2:

a
1234

输出样例2:

Not Found

解答

提交代码 - 1

word=input()
words=input()
count=len(words)-1
while count>=0:
    if words[count] == word:
        print("index = {:d}".format(count))
        break
    count-=1
if count == -1:
    print("Not Found")

image.png
提交代码 - 2

word=input()
words=input()
if words.find(word) != -1:
    # 反转
    words=words[::-1]
    print("index = {:d}".format(len(words)-words.find(word)-1))
else:
    print("Not Found")

image.png

3-5 字符转换 (15 分)

题目

本题要求提取一个字符串中的所有数字字符(‘0’……‘9’),将其转换为一个整数输出。

输入格式:

输入在一行中给出一个不超过80个字符且以回车结束的字符串。

输出格式:

在一行中输出转换后的整数。题目保证输出不超过长整型范围。

输入样例:

free82jeep5

输出样例:

825

解答

提交代码 - 1

str=input()
ans=0
for i in str:
    if i>='0' and i<= '9':
        ans=ans*10+int(i)
print(ans)

image.png
提交代码 - 2

str=input()
ans=[]
for i in str:
    if i.isdigit():
        ans.append(i)
print(int("".join(ans)))

image.png

3-6 求整数序列中出现次数最多的数 (15 分)

题目

本题要求统计一个整型序列中出现次数最多的整数及其出现次数。

输入格式:

输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数。数字间以空格分隔。

输出格式:

在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的。

输入样例:

10 3 2 -1 5 3 4 3 0 3 2

输出样例:

3 4

解答

a = input().split()[1:]#???
d = {
    }
for b in set(a):
    d[a.count(b)]=b
max_count = max(d.keys())
max_number = d.get(max_count)
print('{} {}'.format(max_number,max_count))

image.png

3-7 求最大值及其下标 (20 分)

题目

本题要求编写程序,找出给定的_n_个数中的最大值及其对应的最小下标(下标从0开始)。

输入格式:

输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。

输出格式:

在一行中输出最大值及最大值的最小下标,中间用一个空格分开。

输入样例:

6 2 8 10 1 9 10

输出样例:

10 2

解答

m=int(input())
integers=list(map(int,input().split()))
max_interger=max(integers)
print("{:d} {:d}".format(max_interger,integers.index(max_interger)))

image.png

3-8 字符串逆序 (15 分)

题目

输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。

输入格式:

输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。

输出格式:

在一行中输出逆序后的字符串。

输入样例:

Hello World!

输出样例:

!dlroW olleH

解答

str=input()
print("{}".format(str[::-1]))

image.png

3-9 字符串转换成十进制整数 (15 分)

题目

输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。

输入格式:

输入在一行中给出一个以#结束的非空字符串。

输出格式:

在一行中输出转换后的十进制数。题目保证输出在长整型范围内。

输入样例:

±P-xf4±1!#

输出样例:

-3905

解答

提交代码 - 1

str=input()
flag=1
res=""
checked=False
for i in str:
    if (i>='0' and i<='9') or (i>='A' and i<='F') or (i>='a' and i<='f'):
        res+=i
        checked=True
    elif i=='-' and checked==False:
        flag=-1
if res == '':
    print(0)
else:
    print(flag*int(res,16))

image.png
提交代码 - 2

str=input()
s="123456789abcdefABCDEF"
res=""
for i in str:
    if i in s:
        res+=i
if res == "":
    print(0)
elif str.find(res[0])>str.find('-'):
    print(-int(res,16))
else:
    print(int(res,16))

image.png

3-10 统计大写辅音字母 (15 分)

题目

英文辅音字母是除A、E、I、O、U以外的字母。本题要求编写程序,统计给定字符串中大写辅音字母的个数。

输入格式:

输入在一行中给出一个不超过80个字符、并以回车结束的字符串。

输出格式:

输出在一行中给出字符串中大写辅音字母的个数。

输入样例:

HELLO World!

输出样例:

4

解答

提交代码 - 1

str=input()
s="AEIOU"
count=0
for i in str:
    if (i>='A' and i<='Z') and (i not in s):
        count+=1
print(count)

image.png
提交代码 - 2

str=input()
s="AEIOU"
count=0
for i in str:
    if (i.isupper() == 1) and (i not in s):
        count+=1
print(count)

image.png

3-11 字符串排序 (20 分)

题目

本题要求编写程序,读入5个字符串,按由小到大的顺序输出。

输入格式:

输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。

输出格式:

按照以下格式输出排序后的结果:
After sorted:
每行一个字符串

输入样例:

red yellow blue green white

输出样例:

After sorted:
blue
green
red
white
yellow

解答

lst = list(map(str,input().split()))
lst.sort()
print("After sorted:")
for i in lst:
    print(i)

image.png

3-12 求整数的位数及各位数字之和 (15 分)

题目

对于给定的正整数N,求它的位数及其各位数字之和。

输入格式:

输入在一行中给出一个不超过109的正整数N。

输出格式:

在一行中输出N的位数及其各位数字之和,中间用一个空格隔开。

输入样例:

321

输出样例:

3 6

解答

str=input()
m=len(str)
sum=0
for i in str:
    sum=sum+int(i)
print("{:d} {:d}".format(m,sum))

image.png

3-13 字符串替换 (15 分)

题目

本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:

原字母 对应字母
A Z
B Y
C X
D W
X C
Y B
Z A

输入格式:

输入在一行中给出一个不超过80个字符、并以回车结束的字符串。

输出格式:

输出在一行中给出替换完成后的字符串。

输入样例:

Only the 11 CAPItaL LeTtERS are replaced.

输出样例:

Lnly the 11 XZKRtaO OeGtVIH are replaced.

解答

提交代码 - 1

def change(word):
    return chr(ord('A')+25-(ord(word)-ord('A')))
s=input()
ans=""
for i in s:
    if i>='A' and i<='Z':
        ans+=change(i)
    else:
        ans+=i
print(ans)

image.png
提交代码 - 2

s=input()
ans=[]
for i in s:
    if 'A'<=i<='Z':
        ans.append(chr(155-ord(i)))
    else:
        ans.append(i)
print("".join(ans))

image.png
注意:

ord(‘A’)+25-(ord(word)-ord(‘A’))=ord(‘A’)+25+ord(word)+ord(‘A’) ​

ord(‘A’)=65 ​

65+65+25=155 ​

所以为 155-ord(word)

3-14 字符串字母大小写转换 (15 分)

题目

本题要求编写程序,对一个以“#”结束的字符串,将其小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其他字符不变输出。

输入格式:

输入为一个以“#”结束的字符串(不超过30个字符)。

输出格式:

在一行中输出大小写转换后的结果字符串。

输入样例:

Hello World! 123#

输出样例:

hELLO wORLD! 123

解答

s=input()
s=s.replace('#','')
ans=""
for i in s:
    if i.islower():
        ans+=i.upper()
    elif i.isupper():
        ans+=i.lower()
    else:
        ans+=i
print(ans)

image.png

3-15 统计一行文本的单词个数 (15 分)

题目

本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。

输入格式:

输入给出一行字符。

输出格式:

在一行中输出单词个数。

输入样例:

Let’s go to room 209.

输出样例:

5

解答

str = input().split()
print(len(str))

image.png

3-16 删除重复字符 (20 分)

题目

本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。

输入格式:

输入是一个以回车结束的非空字符串(少于80个字符)。

输出格式:

输出去重排序后的结果字符串。

输入样例:

ad2f3adjfeainzzzv

输出样例:

23adefijnvz

解答

s = list(set(input()))
s.sort()
for i in s:
    print(i,end="")

image.png

3-17 删除字符 (30 分)

题目

输入一个字符串 str,再输入要删除字符 c,大小写不区分,将字符串 str 中出现的所有字符 c 删除。提示:去掉两端的空格。

输入格式:

在第一行中输入一行字符 在第二行输入待删除的字符

输出格式:

在一行中输出删除后的字符串

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

    Bee    E

输出样例1:
在这里给出相应的输出。例如:

result: B

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

7!jdk*!ASyu !

输出样例2:
在这里给出相应的输出。例如:

result: 7jdk*ASyu

解答

str = input().strip()
word = input().strip()
str = str.replace(word.upper(),'').replace(word.lower(),'')
print("result: {}".format(str))

image.png

3-18 输出10个不重复的英文字母 (30 分)

题目

随机输入一个字符串,把最左边的10个不重复的英文字母(不区分大小写)挑选出来。 如没有10个英文字母,显示信息“not found”

输入格式:

在一行中输入字符串

输出格式:

在一行中输出最左边的10个不重复的英文字母或显示信息“not found"

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

poemp134567

输出样例1:
在这里给出相应的输出。例如:

not found

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

This 156is a test example

输出样例2:
在这里给出相应的输出。例如:

Thisaexmpl

解答

提交代码 - 1

string =''.join(input().split())
cont=set()
index=list()
for i in range(0,len(string)):
    old = len(cont)
    if str.isalpha(string[i]):
        cont.add(string[i].lower())
    new = len(cont)
    if(old !=new):
        index.append(i)
        if len(cont) == 10:
            print(*list(map(lambda a: string[a],index)),sep="")
            exit()
print("not found")

image.png
提交代码 - 2

s=input()
ans=[]
for i in s:
    if i.isalpha() and i.upper() not in ans and i.lower() not in ans:
        ans.append(i)
if len(ans)<10:
    print("not found")
else:
    for i in range(10):
        print(ans[i],end="")

image.png

3-19 找最长的字符串 (15 分)

题目

本题要求编写程序,针对输入的N个字符串,输出其中最长的字符串。

输入格式:

输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。

输出格式:
在一行中用以下格式输出最长的字符串:

The longest is: 最长的字符串

如果字符串的长度相同,则输出先输入的字符串。

输入样例:

5 li wang zhang jin xiang

输出样例:

The longest is: zhang

解答

counts = int(input())-1
ans = 0
str = ""
while counts>=0:
    s = input()
    if len(s)>ans:
        ans=len(s)
        str=s
    counts-=1
print("The longest is: {}".format(str))

image.png

3-20 逆序的三位数 (10 分)

题目

程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。

输入格式:

每个测试是一个3位的正整数。

输出格式:

输出按位逆序的数。

输入样例:

123

输出样例:

321

解答

提交代码 - 1

num = int(input())
sum = 0
while num:
    m=num%10
    sum=sum*10+m
    num=int(num/10)
print(sum)

image.png
提交代码 - 2

str = input()
str = str[::-1]
print(int(str))

image.png

3-21 判断回文字符串 (15 分)

题目

输入一个字符串,判断该字符串是否为回文。回文就是字符串中心对称,从左向右读和从右向左读的内容是一样的。

输入格式:

输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。

输出格式:

输出在第1行中输出字符串。如果它是回文字符串,在第2行中输出Yes,否则输出No。

​输入样例1:

level

​输出样例1:

level
Yes

输入样例2:

1 + 2 = 2 + 1 =

输出样例2:

1 + 2 = 2 + 1 =
No

解答

str1 = input()
str2 = str1[::-1]
if str1 == str2:
    print(str1)
    print("Yes")
else:
    print(str1)
    print("No")

image.png

3-22 输出大写英文字母 (15 分)

题目

本题要求编写程序,顺序输出给定字符串中所出现过的大写英文字母,每个字母只输出一遍;若无大写英文字母则输出“Not Found”。

输入格式:

输入为一个以回车结束的字符串(少于80个字符)。

输出格式:

按照输入的顺序在一行中输出所出现过的大写英文字母,每个字母只输出一遍。若无大写英文字母则输出“Not Found”。

输入样例1:

FONTNAME and FILENAME

输出样例1:

FONTAMEIL

输入样例2:

fontname and filrname

输出样例2:

Not Found

解答

str = input()
ans = ""
for i in str:
    if i.isupper() and ans.find(i) == -1:
        ans+=i
if len(ans)==0:
    print("Not Found")
else:
    print(ans)

image.png

第四章

4-1 生成3的乘方表 (15 分)

题目

输入一个非负整数n,生成一张3的乘方表,输出30~3n的值。可调用幂函数计算3的乘方。

输入格式:

输入在一行中给出一个非负整数n。

输出格式:

按照幂的递增顺序输出n+1行,每行格式为“pow(3,i) = 3的i次幂的值”。题目保证输出数据不超过长整型整数的范围。

输入样例:

3

输出样例:

pow(3,0) = 1
pow(3,1) = 3
pow(3,2) = 9
pow(3,3) = 27

解答

m = int(input())
for i in range(m+1):
    print("pow(3,{:d}) = {:d}".format(i, 3**i))

image.png

4-2 统计素数并求和 (20 分)

题目

本题要求统计给定整数_M_和_N_区间内素数的个数并对它们求和。

输入格式:

输入在一行中给出两个正整数M和N(1≤M≤N≤500)。

输出格式:

在一行中顺序输出M和N区间内素数的个数以及它们的和,数字间以空格分隔。

输入样例:

10 31

输出样例:

7 143

解答

def issu(num):
    if num == 1:
        return False
    for i in range(2, num):
        if num % i == 0:
            return False
    return True


m, n = map(int, input().split())
counts = 0
sum = 0
for i in range(m, n+1):
    if issu(i):
        counts += 1
        sum += i
print("{:d} {:d}".format(counts, sum))

image.png

4-3 猴子吃桃问题 (15 分)

题目

一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?

输入格式:

输入在一行中给出正整数N(1<N≤10)。

输出格式:

在一行中输出第一天共摘了多少个桃子。

输入样例:

3

输出样例:

10

解答

m = int(input())
ans = 1
for i in range(1, m):
    ans = (ans + 1) * 2
print(ans)

image.png

4-4 验证“哥德巴赫猜想” (20 分)

题目

数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。

输入格式:

输入在一行中给出一个(2, 2 000 000 000]范围内的偶数N。

输出格式:

在一行中按照格式“N = p + q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如24还可以分解为7+17),要求必须输出所有解中p最小的解。

输入样例:

24

输出样例:

24 = 5 + 19

解答

提交代码 - 1

import math


def issu(num):
    for i in range(2, int(math.sqrt(num))+1):
        if num % i == 0:
            return False
    return True


m = int(input())
for i in range(2, m):
    if issu(i) and issu(m-i):
        print("{} = {} + {}".format(m, i, m-i))
        break

image.png
提交代码 - 2

import math


def issu(num):
    for i in range(2, int(math.sqrt(num))+1):
        if num % i == 0:
            return False
    return True


m = int(input())
for i in range(2, m//2+1):
    if issu(i) and issu(m-i):
        print("{} = {} + {}".format(m, i, m-i))
        break

4-5 求e的近似值 (15 分)

题目

自然常数 e 可以用级数 1+1/1!+1/2!+⋯+1/n!+⋯ 来近似计算。本题要求对给定的非负整数 n,求该级数的前 n+1 项和。

输入格式:

输入第一行中给出非负整数 n(≤1000)。

输出格式:

在一行中输出部分和的值,保留小数点后八位。

输入样例:

10

输出样例:

2.71828180

解答

提交代码 - 1

def factorial(num):
    ans = 1
    for i in range(1, num+1):
        ans *= i
    return ans


N = int(input())
sum = 1
for i in range(1, N+1):
    sum += 1/factorial(i)
print("{:.8f}".format(sum))

image.png
提交代码 - 2

N = int(input())
num = 1
sum = 1
for i in range(1, N+1):
    num *= i
    sum += 1/num
print("{:.8f}".format(sum))

image.png

4-6 输出前 n 个Fibonacci数 (15 分)

题目

本题要求编写程序,输出菲波那契(Fibonacci)数列的前_N_项,每行输出5个,题目保证输出结果在长整型范围内。Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列,例如:1,1,2,3,5,8,13,…。

输入格式:

输入在一行中给出一个整数N(1≤N≤46)。

输出格式:

输出前N个Fibonacci数,每个数占11位,每行输出5个。如果最后一行输出的个数不到5个,也需要换行。如果N小于1,则输出"Invalid."

输入样例1:

7

输出样例1:

      1          1          2          3          5           8         13

输入样例2:

0

输出样例2:

Invalid.

解答

n = int(input())
if n < 1:
    print("Invalid.")
a = 0
b = 1
c = 1
count = 0
for i in range(n):
    print("{:>11d}".format(c), end="")
    c = a + b
    a = b
    b = c
    count += 1
    if count == 5 or i == n-1:
        print("\n", end="")
        count = 0

image.png

4-7 统计学生平均成绩与及格人数 (15 分)

题目

本题要求编写程序,计算学生们的平均成绩,并统计及格(成绩不低于60分)的人数。题目保证输入与输出均在整型范围内。

输入格式:

输入在第一行中给出非负整数N,即学生人数。第二行给出N个非负整数,即这N位学生的成绩,其间以空格分隔。

输出格式:
按照以下格式输出:

average = 成绩均值
count = 及格人数

其中平均值精确到小数点后一位。

输入样例:

5 77 54 92 73 60

输出样例:

average = 71.2
count = 4

解答

nums = int(input())
if(nums == 0):
    print('average = 0.0')
    print('count = 0')
    exit()
grades = list(map(int, input().split()))
average = 0
count = 0
for i in grades:
    average += i
    if i >= 60:
        count += 1
print("average = {:.1f}".format(average/nums))
print("count = {:d}".format(count))

image.png

4-8 求分数序列前N项和 (15 分)

题目

本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+… 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+… 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。

输入样例:

20

输出样例:

32.66

解答

提交代码 - 1

n = int(input())
a = 2
b = 1
sum = 2
for i in range(n-1):
    t = a
    a = a + b
    b = t
    sum += a/b
print("{:.2f}".format(sum))

image.png
提交代码 - 2

n = int(input())
a = 2
b = 1
sum = 2
for i in range(n-1):
    a, b = a+b, a
    sum += a/b
print("{:.2f}".format(sum))

4-9 查询水果价格 (15 分)

题目

给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。

首先在屏幕上显示以下菜单:

[1] apple
[2] pear
[3] orange
[4] grape
[0] exit

用户可以输入编号1~4查询对应水果的单价。当连续查询次数超过5次时,程序应自动退出查询;不到5次而用户输入0即退出;输入其他编号,显示价格为0。

输入格式:

输入在一行中给出用户连续输入的若干个编号。

输出格式:

首先在屏幕上显示菜单。然后对应用户的每个输入,在一行中按格式“price = 价格”输出查询结果,其中价格保留两位小数。当用户连续查询次数超过5次、或主动输入0时,程序结束。

输入样例1:

3 -1 0 2

输出样例1:

[1] apple
[2] pear
[3] orange
[4] grape
[0] exit
price = 4.10
price = 0.00

​输入样例2:

1 2 3 3 4 4 5 6 7 8

输出样例2:

[1] apple
[2] pear
[3] orange
[4] grape
[0] exit
price = 3.00
price = 2.50
price = 4.10
price = 4.10
price = 10.20

解答

goods = ["[1] apple", "[2] pear", "[3] orange", "[4] grape", "[0] exit"]
prices = ["3.00", "2.50", "4.10", "10.20"]
for i in goods:
    print(i)
lst = list(map(int, input().split()))
count = 0
for i in lst:
    count += 1
    if count > 5:
        exit()
    if 1 <= i <= 4:
        print("price = {}".format(prices[i-1]))
    elif i == 0:
        exit()
    else:
        print("price = 0.00")

image.png

4-10 最大公约数和最小公倍数 (15 分)

题目

本题要求两个给定正整数的最大公约数和最小公倍数。

输入格式:

输入在一行中给出两个正整数M和N(≤1000)。

输出格式:

在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

输入样例:

511 292

输出样例:

73 2044

解答

def gcd(a, b):
    if a % b == 0:
        return b
    else:
        return gcd(b, a % b)


n, m = input().split()
n = int(n)
m = int(m)
print('{:d} {:d}'.format(gcd(n, m), n*m//gcd(n, m)))

image.png

4-11 判断素数 (20 分)

题目

判断一个给定的正整数是否素数

输入格式:

输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于1000000 的需要判断的正整数

输出格式:

对每个需要判断的正整数,如果它是素数,则在一行中输出Yes,否则输出No

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

2
11
111

输出样例:
在这里给出相应的输出。例如:

Yes
No

解答

import math


def judge(num):
    if num == 1:
        return False
    for i in range(2, int(math.sqrt(num))+1):
        if num % i == 0:
            return False
    return True


n = int(input())
while n > 0:
    num = int(input())
    if judge(num):
        print("Yes")
    else:
        print("No")
    n -= 1

image.png

4-12 求满足条件的斐波那契数 (30 分)

题目

斐波那契数,亦称之为斐波那契数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……,这个数列从第3项开始,每一项都等于前两项之和。求大于输入数的最小斐波那契数。

输入格式:

在一行输人一个正整数n(n>=10)。

输出格式:

在一行输出大于n的最小斐波那契数。

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

10

输出样例:
在这里给出相应的输出。例如:

13

解答

num = int(input())
a = 1
b = 1
c = a + b
while c < num:
    a, b = b, a+b
    c = a+b
print(c)

image.png

num = int(input())
a = 1
b = 1
while b < num:
    a, b = b, a+b
print(b)

image.png

4-13 求误差小于输入值的e的近似值 (20 分)

题目

自然常数e可以用级数1+1/1!+1/2!+⋯+1/n!来近似计算。ei代表前i项求和。输入误差范围error,当
ei+1-ei<error,则表示e的近似值满足误差范围。

输入格式:

在一行输入误差范围,误差小于等于0.01。

输出格式:

在一行输出e的近似值(保留6位小数)。

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

0.01

输出样例1:
在这里给出相应的输出。例如:

2.716667

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

0.000000001

输出样例2:
在这里给出相应的输出。例如:

2.718282

解答

error = float(input())
sum = 1
count = 1
n = 1
while True:
    n = n*count
    count += 1
    sum += 1/n
    if 1/n < error:
        print("{:.6f}".format(sum))
        break

image.png

4-14 统计字符 (15 分)

题目

本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。
本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。

输入格式:

输入为10个字符。最后一个回车表示输入结束,不算在内。

输出格式:
在一行内按照

letter = 英文字母个数, blank = 空格或回车个数, digit = 数字字符个数, other = 其他字符个数

的格式输出。

输入样例:

aZ &
09 Az

输出样例:

letter = 4, blank = 3, digit = 2, other = 1

解答

letter_nums = 0
blank_nums = 0
digit_nums = 0
other_nums = 0
count = 0
str = ""
while True:
    s = input()
    count += 1
    str += s
    if len(str)+count > 10:
        count -= 1
        break
blank_nums += count
for i in str:
    if i.isalpha():
        letter_nums += 1
    elif i.isspace():
        blank_nums += 1
    elif i.isdigit():
        digit_nums += 1
    else:
        other_nums += 1
print("letter = {}, blank = {}, digit = {}, other = {}".format(
    letter_nums, blank_nums, digit_nums, other_nums))

image.png

4-15 换硬币 (20 分)

题目

将一笔零钱换成5分、2分和1分的硬币,要求每种硬币至少有一枚,有几种不同的换法?

输入格式:

输入在一行中给出待换的零钱数额x∈(8,100)。

输出格式:

要求按5分、2分和1分硬币的数量依次从大到小的顺序,输出各种换法。每行输出一种换法,格式为:“fen5:5分硬币数量, fen2:2分硬币数量, fen1:1分硬币数量, total:硬币总数量”。最后一行输出“count = 换法个数”。

输入样例:

13

输出样例:

fen5:2, fen2:1, fen1:1, total:4
fen5:1, fen2:3, fen1:2, total:6
fen5:1, fen2:2, fen1:4, total:7
fen5:1, fen2:1, fen1:6, total:8
count = 4

解答

num = int(input())
count = 0
for i in range(num//5, 0, -1):
    for j in range(num//2, 0, -1):
        for k in range(num, 0, -1):
            if 5*i+2*j+k == num:
                print("fen5:{}, fen2:{}, fen1:{}, total:{}".format(i, j, k, i+j+k))
                count += 1
print("count = {}".format(count))

image.png

4-16 jmu-python-判断是否构成三角形 (10 分)

题目

输入三角形的三边,判断是否能构成三角形。若能构成输出yes,否则输出no。

输入格式:

在一行中直接输入3个整数,3个整数之间各用一个空格间隔,没有其他任何附加字符。

输出格式:

直接输出yes或no,没有其他任何附加字符。

输入样例1:

3 4 5

输出样例1:

yes

输入样例2:

1 2 3

输出样例2:

no

解答

a, b, c = map(int, input().split())
if a+b > c and a+c > b and b+c > a:
    print("yes")
else:
    print("no")

image.png

4-17 水仙花数(20 分) (20 分)

题目

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。 例如:153=1×1×1+5×5×5+3×3×3。

本题要求编写程序,计算所有N位水仙花数。
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。 例如:153=1×1×1+5×5×5+3×3×3。
本题要求编写程序,计算所有N位水仙花数。

输入格式:

输入在一行中给出一个正整数N(3≤N≤5)

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

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

3

输出样例:
在这里给出相应的输出。例如:

153
370
371
407

解答

提交代码 - 1

def judge(num, n):
    sum = 0
    i = num
    while i > 0:
        sum += pow(i % 10, n)
        i //= 10
    if sum == num:
        return True
    else:
        return False


n = int(input())
for i in range(pow(10, n-1), pow(10, n)):
    if judge(i, n):
        print(i)

image.png提交代码 - 2

n = int(input())
for num in range(10**(n-1), 10**n):
    lists = map(int, str(num))
    sum = 0
    for i in lists:
        sum += i**n
    if sum == num:
        print(num)

4-18 猴子选大王 (20 分)

题目

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:

输入在一行中给一个正整数N(≤1000)。

输出格式:

在一行中输出当选猴王的编号。

输入样例:

11

输出样例:

7

解答

n = int(input())
ans = 0
for i in range(2, n+1):
    ans = (ans+3) % i
print(ans+1)

image.png

4-19 矩阵运算 (20 分)

题目

给定一个_n_×_n_的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。

输入格式:

输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。

输出格式:

在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。

输入样例:

4
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1

输出样例:

35

解答

n = int(input())
index = n-1
ans = 0
while n > 1:
    lst = list(map(int, input().split()))
    for i, num in enumerate(lst):
        if i != len(lst)-1 and i != index:
            ans += num
    index -= 1
    n -= 1
print(ans)

image.png

4-20 求矩阵各行元素之和 (15 分)

题目

本题要求编写程序,求一个给定的_m_×_n_矩阵各行元素之和。

输入格式:

输入第一行给出两个正整数m和n(1≤m,n≤6)。随后m行,每行给出n个整数,其间以空格分隔。

输出格式:

每行输出对应矩阵行元素之和。

​输入样例:

3 2
6 3
1 -8
3 12

输出样例:

9
-7
15

解答

m, n = map(int, input().split())
while m:
    lst = list(map(int, input().split()))
    sum = 0
    for i in lst:
        sum += i
    m -= 1
    print(sum)

image.png

4-21 判断上三角矩阵 (15 分)

题目

上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。
本题要求编写程序,判断一个给定的方阵是否上三角矩阵。

输入格式:

输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:

每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。

输入样例:

3
3
1 2 3
0 4 5
0 0 6
2
1 0
-8 2
3
1 2 3
1 4 5
0 -1 6

输出样例:

YES
NO
NO

解答

def judge(a):
    for i in range(len(a)):
        for j in range(len(a)):
            if i > j and a[i][j] != 0:
                return False
    return True


t = int(input())
while t:
    n = int(input())
    a = []
    while n:
        s = input()
        a.append([int(i) for i in s.split()])
        n -= 1
    if judge(a):
        print("YES")
    else:
        print("NO")
    t -= 1

image.png

4-22 找鞍点 (20 分)

题目

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序,求一个给定的n阶方阵的鞍点。

输入格式:

输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:

输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

​输入样例1:

4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9

​输出样例1:

2 1

​输入样例2:

2 1 7 4 1

​输出样例2:

NONE

解答

n = int(input())
a = []
for i in range(n):
    a.append(list(map(int, input().split())))
for i in range(n):
    max_num_row = max(a[i][k] for k in range(n))
    for j in range(n):
        max_num_col = min(a[k][j] for k in range(n))
        if max_num_row == max_num_col:
            print("{} {}".format(i, j))
            exit()
print("NONE")

image.png

4-23 求矩阵的局部极大值 (15 分)

题目

给定_M_行_N_列的整数矩阵_A_,如果_A_的非边界元素_A_[i][j]大于相邻的上下左右4个元素,那么就称元素_A_[i][j]是矩阵的局部极大值。本题要求给定矩阵的全部局部极大值及其所在的位置。

输入格式:

输入在第一行中给出矩阵A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的值。数字间以空格分隔。

输出格式:

每行按照“元素值 行号 列号”的格式输出一个局部极大值,其中行、列编号从1开始。要求按照行号递增输出;若同行有超过1个局部极大值,则该行按列号递增输出。若没有局部极大值,则输出“None 总行数 总列数”。

输入样例1:

4 5
1 1 1 1 1
1 3 9 3 1
1 5 3 5 1
1 1 1 1 1

输出样例1:

9 2 3
5 3 2
5 3 4

输入样例2:

3 5
1 1 1 1 1
9 3 9 9
1 1 5 3 5 1

输出样例2:

None 3 5

解答

m, n = map(int, input().split())
a = []
count = 0
for i in range(m):
    a.append(list(map(int, input().split())))
for i in range(1, m-1):
    for j in range(1, n-1):
        if a[i][j] > a[i-1][j] and a[i][j] > a[i][j+1] and a[i][j] > a[i+1][j] and a[i][j] > a[i][j-1]:
            print("{} {} {}".format(a[i][j], i+1, j+1))
            count += 1
if count == 0:
    print("None {} {}".format(m, n))

image.png

4-24 打印九九口诀表 (15 分)

题目

下面是一个完整的下三角九九口诀表:

11=1
1
2=2 22=4
1
3=3 23=6 33=9
14=4 24=8 34=12 44=16
15=5 25=10 35=15 45=20 55=25
1
6=6 26=12 36=18 46=24 56=30 66=36
1
7=7 27=14 37=21 47=28 57=35 67=42 77=49
18=8 28=16 38=24 48=32 58=40 68=48 78=56 88=64
19=9 29=18 39=27 49=36 59=45 69=54 79=63 89=72 9*9=81

本题要求对任意给定的一位正整数N,输出从11到NN的部分口诀表。

输入格式:

输入在一行中给出一个正整数N(1≤N≤9)。

输出格式:

输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。

输入样例:

4

输出样例:

11=1
1
2=2 22=4
1
3=3 23=6 33=9
14=4 24=8 34=12 44=16

解答

n = int(input())
for i in range(1, n+1):
    for j in range(1, n+1):
        if i >= j:
            print("{}*{}={:<4d}".format(j, i, i*j), end="")
    print()

image.png

4-25 输出三角形字符阵列 (15 分)

题目

本题要求编写程序,输出n行由大写字母A开始构成的三角形字符阵列。

输入格式:

输入在一行中给出一个正整数n(1≤n<7)。

输出格式:

输出n行由大写字母A开始构成的三角形字符阵列。格式见输出样例,其中每个字母后面都有一个空格。

输入样例:

4

输出样例:

A B C D
E F G
H I
J

解答

n = int(input())
count = 0
while n:
    for i in range(1, n+1):
        print("{} ".format(chr(ord('A')+count)), end="")
        count += 1
    print()
    n -= 1

image.png

4-26 求1!+3!+5!+……+n! (10 分)

题目

求1!+3!+5!+……+n!的和,要求用循环嵌套设计,n<12。

输入格式:

输入在一行中给出一个不超过12的正整数n。

输出格式:

在一行中按照格式“n=n值,s=阶乘和”的顺序输出,其中阶乘和是正整数。

输入样例:

5

输出样例:

n=5,s=127

解答

n = int(input())
t = 1
sum = 1
for i in range(1, n+1, 2):
    if i != 1:
        for j in range(i-1, i+1):
            t *= j
        sum += t
print("n={},s={}".format(n, sum))

image.png

4-27 二维数组中每行最大值和每行和 (10 分)

题目

求一个3*3二维数组中每行的最大值和每行的和。

输入格式:

在一行中输入9个小于100的整数,其间各以一个空格间隔

输出格式:

输出3行3列的二维数组,并在每行后面分别输出每行最大值和每行元素的和,每个数据输出占4列。

输入样例:

3 6 5 9 8 2 1 4 5

输出样例:

3 6 5 6 14
9 8 2 9 19
1 4 5 5 10

解答

lst = list(map(int, input().split()))
for i in range(3):
    max_num = lst[i*3]
    sum = 0
    for j in range(3):
        max_num = max(max_num, lst[i*3+j])
        sum += lst[i*3+j]
        print("{:4d}".format(lst[i*3+j]), end="")
    print("{:4d}{:4d}".format(max_num, sum))

image.png

4-28 矩阵转置 (10 分)

题目

将一个3×3矩阵转置(即行和列互换)。

输入格式:

在一行中输入9个小于100的整数,其间各以一个空格间隔。

​输出格式:

输出3行3列的二维数组,每个数据输出占4列。

输入样例:

1 2 3 4 5 6 7 8 9

输出样例:

1 4 7
2 5 8
3 6 9

解答

lst = list(map(int, input().split()))
for i in range(3):
    for j in range(3):
        print("{:4d}".format(lst[i+j*3]), end="")
    print()

image.png

4-29 找出不是两个数组共有的元素 (20 分)

题目

给定两个整型数组,本题要求找出不是两者共有的元素。

输入格式:

输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。

输出格式:

在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。

输入样例:

10 3 -5 2 8 0 3 5 -15 9 100
11 6 4 8 2 6 -5 9 0 100 8 1

输出样例:

3 5 -15 6 4 1

解答

注意:返回答案的顺序也是有要求的
暴力解法

lst1 = list(map(int, input().split()))
lst2 = list(map(int, input().split()))
lst1 = lst1[1:]
lst2 = lst2[1:]
ans = []
for i in lst1:
    if i not in lst2 and i not in ans:
        ans.append(i)
for i in lst2:
    if i not in lst1 and i not in ans:
        ans.append(i)
for i, num in enumerate(ans):
    if i != len(ans)-1:
        print("{} ".format(num), end="")
    else:
        print("{}".format(num))

image.png

4-30 找完数 (20 分)

题目

所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。

输入格式:

输入在一行中给出2个正整数m和n(1<m≤n≤10000),中间以空格分隔。

输出格式:

逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + … + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。

输入样例:

2 30

​输出样例:

6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14

解答

暴力

import math
m, n = map(int, input().split())
count = 0
for i in range(m, n+1):
    ans = []
    for j in range(1, i):
        if i % j == 0:
            ans.append(j)
    if sum(ans) == i:
        count += 1
        print("{} = ".format(i), end="")
        print(' + '.join('%s' % id for id in ans))
if count == 0:
    print("None")

image.png
优化后

import math
m, n = map(int, input().split())
count = 0
for i in range(m, n+1):
    ans = []
    ans.append(1)
    for j in range(2, int(math.sqrt(i)+1)):
        if i % j == 0:
            ans.append(j)
            if j*j != i:
                ans.append(i//j)
    if sum(ans) == i:
        count += 1
        ans.sort()
        print("{} = ".format(i), end="")
        print(' + '.join('%s' % id for id in ans))
if count == 0:
    print("None")

image.png

第五章

5-1 输出星期名缩写 (70 分)

题目

输入一个1到7的数字,输出对应的星期名的缩写。

1 Mon
2 Tue
3 Wed
4 Thu
5 Fri
6 Sat
7 Sun

输入格式:

输入1到7之间数字

输出格式:

输出对应的星期名的缩写

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

1

输出样例:
在这里给出相应的输出。例如:

Mon

解答

days = {
    1:'Mon',2:'Tue',3:'Wed',4:'Thu',5:'Fri',6:'Sat',7:'Sun'}
index = int(input())
print(days[index])

image.png

5-2 图的字典表示 (20 分)

题目

image.png
图的字典表示。输入多行字符串,每行表示一个顶点和该顶点相连的边及长度,输出顶点数,边数,边的总长度。比如上图0点表示:{‘O’:{‘A’:2,‘B’:5,‘C’:4}}。

用eval函数处理输入,eval函数具体用法见第六章内置函数。

输入格式:

第一行表示输入的行数 下面每行输入表示一个顶点和该顶点相连的边及长度的字符串

输出格式:

在一行中输出顶点数,边数,边的总长度

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

4
{‘a’:{‘b’:10,‘c’:6}}
{‘b’:{‘c’:2,‘d’:7}}
{‘c’:{‘d’:10}} {‘d’:{}}

输出样例:
在这里给出相应的输出。例如:

4 5 35

解答

n=int(input())
sum=0
length=0
for i in range(n):
    dic=eval(input())
    for j in dic:
        temp=dic[j]
        for k in temp:
            sum+=1
            length+=temp[k]
print("{} {} {}".format(n,sum,length))

image.png

5-3 四则运算(用字典实现) (30 分)

题目

四则运算(用字典实现),比较c语言的switch语句。

输入格式:

在一行中输入一个数字 在一行中输入一个四则运算符(+,-,*,/) 在一行中输入一个数字

输出格式:

在一行中输出运算结果(小数保留2位)

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

7 / 3

输出样例1:
在这里给出相应的输出。例如:

2.33

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

10 / 0

输出样例2:
在这里给出相应的输出。例如:

divided by zero

解答

参考:https://blog.csdn.net/chen_zan_yu_/article/details/103406089

res = {
    '+': 'x+y', '-': 'x-y', '*': 'x*y',
       '/': "x/y if y!=0  else 'divided by zero'"}
# 除法部分分三元式表示
x = int(input())
operation = input()
y = int(input())
# print(res[operation]) 除零返回字符串,其余返回数字类型
r = eval(res[operation])
if type(r) != str:
    print(format(r, '.2f'))
else:
    print(r)

image.png

5-4 分析活动投票情况 (20 分)

题目

利用集合分析活动投票情况。第一小队有五名队员,序号是1,2,3,4,5;第二小队也有五名队员,序号6,7,8,9,10。输入一个得票字符串,求第二小队没有得票的队员

输入格式:

在一行中输入得票的队员的序列号,用逗号隔开。

输出格式:

一行中输出第二小队没有得票的队员序号。

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

1,5,9,3,9,1,1,7,5,7,7,3,3,1,5,7,4,4,5,4,9,5,10,9

输出样例:
在这里给出相应的输出。例如:

6 8

解答

提交代码 - 1

tickets=list(set(map(int,input().split(','))))
a=[]
for i in range(6,11):
    if i not in tickets:
        a.append(i)
print(' '.join('%s' %id for id in a))

image.png
提交代码 - 2

tickets=list(set(map(str,input().split(','))))
a=[]
for i in range(6,11):
    if str(i) not in tickets:
        a.append(str(i))
ans=' '.join(a)
print(ans)

image.png

5-5 统计字符出现次数 (20 分)

题目

本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。

输入格式:

输入第一行给出一个以回车结束的字符串(少于80个字符);第二行输入一个字符。

输出格式:

在一行中输出给定字符在给定字符串中出现的次数。

输入样例:

programming is More fun! m

输出样例:

2

解答

str1=input()
a=input()
count=0
for i in str1:
    if i==a:
        count+=1
print(count)

image.png

5-6 统计工龄 (20 分)

题目

给定公司N名员工的工龄,要求按工龄增序输出每个工龄段有多少员工。

输入格式:

输入首先给出正整数N(≤105),即员工总人数;随后给出N个整数,即每个员工的工龄,范围在[0, 50]。

输出格式:

按工龄的递增顺序输出每个工龄的员工个数,格式为:“工龄:人数”。每项占一行。如果人数为0则不输出该项。

输入样例:

8 10 2 0 5 7 2 5 2

输出样例:

0:1 2:3 5:2 7:1 10:1

解答

n=int(input())
ages=list(map(int,input().split()))
dic={
    }
for i in ages:
    dic[i]=dic.get(i,0)+1
for i in sorted(dic):
    print("{}:{}".format(i,dic[i]))

image.png

5-7 列表去重 (40 分)

题目

输入一个列表,去掉列表中重复的数字,按原来次序输出!

输入格式:

在一行中输入列表

​输出格式:

在一行中输出不重复列表元素

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

[4,7,5,6,8,6,9,5]

​输出样例:
在这里给出相应的输出。例如:

4 7 5 6 8 9

解答

lst1=eval(input())
lst2=list(set(lst1))
print(' '.join(map(str,sorted(lst2,key=lst1.index))))

image.png

5-8 能被3,5和7整除的数的个数(用集合实现) (30 分)

题目

求指定区间内能被3,5和7整除的数的个数

输入格式:

在一行中从键盘输入2个正整数a,b(1<=a<b<=10000000),用空格隔开。

​输出格式:

在一行输出大于等于a且小于等于b的能被3,5和7整除的数的个数。

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

10 100

​输出样例1:
在这里给出相应的输出。例如:

0

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

1000 100000

​输出样例:
在这里给出相应的输出。例如:

943

解答

m,n=map(int,input().split())
set_1=set()
set_2=set()
set_3=set()
for i in range(m,n+1):
    if i%3==0:
        set_1.add(i)
    if i%5==0:
        set_2.add(i)
    if i%7==0:
        set_3.add(i)
print(len(set_1 & set_2 & set_3))

image.png

5-9 求矩阵鞍点的个数 (30 分)

题目

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。

本题要求编写程序,求一个给定的n阶方阵的鞍点。

输入格式:

输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。

​输出格式:

鞍点的个数

​输入样例1:

4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9

​输出样例1:

1

输入样例2:

2 1 7 4 1

输出样例2:

0

​输入样例3:

3
4 7 8
1 3 3
2 3 1

输出样例3:

2

解答

n=int(input())
a=[]
count=0
for i in range(n):
    a.append(list(map(int,input().split())))
for i in range(n):
    max_num_row=max(a[i][k] for k in range(n))
    for j in range(n):
        max_num_col=min(a[k][j] for k in range(n))
        if max_num_row == max_num_col:
            count+=1
print(count)

image.png

n = int(input())
# 原矩阵
lis = [list(map(int, input().split()))for i in range(n)]
# 转置矩阵 
lis_1 = [[lis[j][i] for j in range(n)]for i in range(n)]
print(lis_1)
# 依次遍历lis max(lis[i]):原矩阵行最大值 min(lis_1[j]):原矩阵列最大值
print(len([0 for i in range(n)
           for j in range(n) if lis[i][j] == max(lis[i]) == min(lis_1[j])]))

image.png

5-10 两数之和 (30 分)

题目

给定一组整数,还有一个目标数,在给定这组整数中找到两个数字,使其和为目标数,如找到,解是唯一的。找不到则显示 “no answer”。输出的下标按从小到大排序。用一重循环加字典实现。

输入格式:

在一行中给出这组数。 在下一行输入目标数

输出格式:

在一行中输出这两个数的下标,用一个空格分开。

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

2,7,11,15 9

输出样例1:
在这里给出相应的输出。例如:

0 1

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

3,6,9 10

输出样例2:
在这里给出相应的输出。例如:

no answer

解答

lst=list(map(int,input().split(',')))
target=int(input())
m=dict()
for i,num in enumerate(lst):
    if target-num in m:
        print("{} {}".format(m[target-num],i))
        exit()
    m[num]=i
print("no answer")

image.png

5-11 字典合并 (40 分)

题目

输入用字符串表示两个字典,输出合并后的字典。字典的键用一个字母或数字表示。注意:1和‘1’是不同的关键字!

输入格式:

在第一行中输入第一个字典字符串;
在第二行中输入第二个字典字符串。

输出格式:

在一行中输出合并的字典,输出按字典序。
“1” 的 ASCII 码为 49,大于 1,排序时 1 在前,“1” 在后。其它的字符同理。

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

{1:3,2:5}
{1:5,3:7}

输出样例1:
在这里给出相应的输出。例如:

{1:8,2:5,3:7}

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

{“1”:3,1:4} {“a”:5,“1”:6}

输出样例2:
在这里给出相应的输出。例如:

{1:4,“1”:9,“a”:5}

解答

注意:**字典的键用一个字母或数字表示! **

这道题简单的合并两个字典比较简单,难点在输出时需要对字典的键值进行一个排序

题目中给出键只能是一个字母或者一个数字(??这里其实有歧义 一个数字是指一位的数字还是任意数字)

这里假设的是为一个一位的数字,认为int型数字比字符排在前面

dict1=dict(eval(input()))
dict2=dict(eval(input()))
for i in dict2:
    if i in dict1:
        dict1[i]+=dict2[i]
    else:
        dict1[i]=dict2[i]
intKeys=[]
strKeys=[]
for i in dict1.keys():
    if type(i)==int:
        intKeys.append(i)
    else:
        strKeys.append(i)
intKeys.sort()
strKeys.sort()
ans=[]
for i in intKeys+strKeys:
    temp=""
    if type(i)==int:
        temp=str(i)+":"+str(dict1[i])
    else:
        temp='"'+i+'"'+":"+str(dict1[i])
    ans.append(temp)
s1=','.join(ans)
s1='{'+s1+'}'
print(s1)

image.png

第六章

6-1 输入列表,求列表元素和(eval输入应用) (10 分)

题目

在一行中输入列表,输出列表元素的和。

输入格式:

一行中输入列表。

输出格式:

在一行中输出列表元素的和。

输入样例:

[3,8,-5]

输出样例:

6

解答

提交代码 - 1

lst=eval(input())
print(eval('+'.join('%s' %id for id in lst)))

image.png
提交代码 - 2

print(sum(eval(input())))

image.png

6-2 一帮一 (15 分)

题目

“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。
本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。

输入格式:

输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。

输出格式:

每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。

输入样例:

8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda

输出样例:

Amy Jack
Tom Linda
Bill Maya
Cindy John

解答

#!/usr/bin/python3
# 存储所有学生的名字 根据名次排序
students = []
# 存储女孩的名字 根据名次排序
girl = []
# 存储男孩的名字 根据名次排序
boy = []
n = int(input())
for i in range(n):
    student = input().split()
    students.append(student[1])
    if student[0] == '0':
        boy.append(student[1])
    else:
        girl.append(student[1])
# 遍历前4名
for i in range(n//2):
    # 如果是男孩
    if students[i] in boy:
        # 找到该孩子在男孩中的名次 与index对应 比如在第1名index为0
        # 男孩中的第一个应该与女孩中的最后一个组合
        # 所以 男孩的索引为index 那么女孩的索引就是-1-index
        # -1表示最后一个 再-index表示往前几个
        # 例如:-1-1 表示再最后一个的基础上再前进2个元素
        index = boy.index(students[i])
        print("{} {}".format(students[i], girl[-1-index]))
    else:
        index = girl.index(students[i])
        print("{} {}".format(students[i], boy[-1-index]))

image.png

6-3 列表或元组的数字元素求和 (20 分)

题目

求列表中数字和,列表中嵌套层次不限2层

输入格式:

在一行中输入列表或元组

输出格式:

在一行中输出数字的和

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

[11,2,[3,7],(68,-1),“123”,9]

输出样例:
在这里给出相应的输出。例如:

99

解答

注意题目中只需要求的是数字和

例子:[11,2,[3,7],(68,-1),“123”,9] 中“123”属于字符串,不再计算范围内

正确计算是:11+2+3+7+68+(-1)+9=99

编写代码时注意不要将字符串也纳入计算范围内了,注意提取正确的数字,避开字符串(开始还没有注意到)

#!/usr/bin/python3
s = input()
# s为字符串
# 首先将[]()替换
s = s.replace('[', '')
s = s.replace(']', '')
s = s.replace('(', '')
s = s.replace(')', '')
# 注意”123“属于字符串 不属于数字 我们是不需要的
s2 = ""
# 记录”的个数
count = 0
# 遍历s
# 统计“的个数 如果为偶数且不为” 说明为数字
for i in s:
    if i == '"':
        count += 1
    if count % 2 == 0 and i != '"':
        s2 += i
# 替换逗号
s2 = s2.replace(',', ' ')
# 注意可能两个数中间原来有两个逗号 替换后就有两个空格
# 再利用split() 提取元素 转化为list类型
s2 = s2.split()
ans = 0
# 遍历s2 list类型
for i in s2:
    ans += int(i)
print(ans)

image.png

6-4 列表数字元素加权和(1) (40 分)

题目

输入一个嵌套列表,嵌套层次不限,根据层次,求列表元素的加权和。第一层每个元素 的值为:元素值1,第二层每个元素的值为:元素值2,第三层每个元素的值为:元素值*3, …,以此类推!

输入格式:

在一行中输入列表

​输出格式:

在一行中输出加权和

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

[1,2,[3,4,[5,6],7],8]

输出样例:
在这里给出相应的输出。例如:

72

解答

有几个需要注意的地方:

  • 其中的数字可以为两位数、三位数
  • 数字也可以为负数

提供的一些测试数据

  • [1]
  • [-1]
  • [1,[19,1],2]

踩坑:如果开始以字符串读取,再逐一读取字符,需要注意每次读取只得到一个字符。比如字符串“234”,读取是2、3、4 这个地方易错

# 以字符串类型读入数据
s = input()
# count:统计[、]字符的个数 遇到[ +1 遇到] -1
count = 0
# ans:最后结果
ans = 0
# 字符串索引
index = 0
# 判断一个数是负数还是正数
flag = 1

# 遍历字符串
while index < len(s):
    # 遇到[ 层级+1
    if s[index] == '[':
        count += 1
    # 遇到] 层级-1
    elif s[index] == ']':
        count -= 1
    # 遇到 '-' 说明之后的数字为负数
    elif s[index] == '-':
        flag = -1
    # 如果是一个数字 则需要判断后面是否接着为数字
    # 如果是 还得拼接数字 比如23
    # 因为是逐个字符读取
    # 每次只读一个字符
    # 读到2时 还需要判断后面是否还是数字
    # 如果是 需要拼接为23
    elif s[index].isdigit():
        index2 = index
        num = 0
        while s[index2].isdigit():
            num = num*10+int(s[index2])
            index2 += 1
        # 更新index
        index = index2-1
        # 更新ans 注意正负号
        ans = ans+count*num*flag
        # 最后需要将flag再次设置为1
        flag = 1
    index += 1
print(ans)

image.png

6-5 列表元素个数的加权和(1) (40 分)

题目

输入一个嵌套列表,嵌套层次不限,根据层次,求列表元素的加权个数和。第一层每个元素算一个元素,第二层每个元素算2个元素,第三层每个元素算3个元素,第四层每个元素算4个元素,…,以此类推!

输入格式:

在一行中输入一个列表。

输出格式:

在一行中输出加权元素个数值。

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

[1,2,[3,4,[5,6],7],8]

输出样例:
在这里给出相应的输出。例如:

15

解答

在上一题思路上简化即可

s = input()
count = 0
ans = 0
index = 0
while index < len(s):
    if s[index] == '[':
        count += 1
    elif s[index] == ']':
        count -= 1
#    elif s[index]=='-':
#       flag=-1
    elif s[index].isdigit():
        index2 = index
        while s[index2].isdigit():
            index2 += 1
        index = index2-1
        ans = ans+count
    index += 1
print(ans)

image.png

第6章-6 求指定层的元素个数 (40 分)

题目

输入一个嵌套列表,再输入层数,求该层的数字元素个数。

输入格式:

第一行输入列表 第二行输入层数

输出格式:

在一行中输出元素个数

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

[1,2,[3,4,[5,6],7],8] 3

输出样例:
在这里给出相应的输出。例如:

2

解答

s = input()
n=int(input())
count = 0
ans = {
    }
index = 0
while index < len(s):
    if s[index] == '[':
        count += 1
    elif s[index] == ']':
        count -= 1
    elif s[index].isdigit():
        index2 = index
        while s[index2].isdigit():
            index2 += 1
        index = index2-1
        ans[count]=ans.get(count,0)+1
    index += 1
print(ans[n])

image.png

6-7 找出总分最高的学生 (15 分)

题目

给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。

输入格式:

输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2 成绩3”,中间以空格分隔。

输出格式:

在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。

输入样例:

5
00001 huanglan 78 83 75
00002 wanghai 76 80 77
00003 shenqiang 87 83 76
10001 zhangfeng 92 88 78
21987 zhangmeng 80 82 75

输出样例:

zhangfeng 10001 258

解答

n = int(input())
maxSumGrades = 0
maxSumGradesIndex = 0
students = []
for i in range(n):
    student = list(input().split())
    sumGrades = 0
    for j in range(2, 5):
        sumGrades += int(student[j])
    if sumGrades > maxSumGrades:
        maxSumGrades = sumGrades
        maxSumGradesIndex = i
    students.append(student)
print("{} {} {}".format(students[maxSumGradesIndex][1], students[maxSumGradesIndex][0], maxSumGrades))

image.png

6-8 输出全排列 (20 分)

题目

输入整数n(3<=n<=7),编写程序输出1,2,…,n整数的全排列,按字典序输出。

输入格式:

一行输入正整数n。

输出格式:

按字典序输出1到n的全排列。每种排列占一行,数字间无空格。

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

3

输出样例:
在这里给出相应的输出。例如:

123
132
213
231
312
321

解答

1-n的全排列(3<=n<=7)
最小数一定是:123…45…n
最大数是:n…54…321
思路(暴力循环):

  • 从123…n 到 n…321 依次遍历
  • 对其进行set操作
  • 当set(num)==set(“123…n”)时
  • 说明是符合条件的全排列
n = int(input())
ls = [str(i) for i in range(1, n+1)]
s = "1234567"
# beg=123...n
beg = int(s[:n])
# end=n...321
end = int(s[n-1::-1])
for x in range(beg, end+1):
    if set(str(x)) == set(ls):
        print(x)

image.png

第七章

第7章-1 词频统计 (30 分)

题目

请编写程序,对一段英文文本,统计其中所有不同单词的个数,以及词频最大的前10%的单词。

所谓“单词”,是指由不超过80个单词字符组成的连续字符串,但长度超过15的单词将只截取保留前15个单词字符。而合法的“单词字符”为大小写字母、数字和下划线,其它字符均认为是单词分隔符。

输入格式:

输入给出一段非空文本,最后以符号#结尾。输入保证存在至少10个不同的单词。

输出格式:

在第一行中输出文本中所有不同单词的个数。注意“单词”不区分英文大小写,例如“PAT”和“pat”被认为是同一个单词。
随后按照词频递减的顺序,按照词频:单词的格式输出词频最大的前10%的单词。若有并列,则按递增字典序输出。

输入样例:

This is a test. The word “this” is the word with the highest frequency. Longlonglonglongword should be cut off, so is considered as the same as longlonglonglonee. But this_8 is different than this, and this, and this…# this line should be ignored.结尾无空行

输出样例:(注意:虽然单词the也出现了4次,但因为我们只要输出前10%(即23个单词中的前2个)单词,而按照字母序,the排第3位,所以不输出。)

23
5:this
4:is

解答

之前忘了做这道题 这次没有做出来 对一些库的函数掌握的还是不好 记不住
代码参考 :https://blog.csdn.net/qq_43733499/article/details/102723092

# 导入库
import re
import collections
import sys

words = "".join([line for line in sys.stdin]) # 标准输入sys.stdin读入文本
words = re.compile(r"\w+", re.I).findall(words.lower().split('#')[0]) # 正则表达式将文本处理成全小写并读到符号#
words = [each.strip() for each in words] # 去除空格
words = list(map(lambda each: each[0:15] if len(each) > 15 else each, words)) # 长度超过15的单词将只截取保留前15个单词字符
counter = collections.Counter(words) # 使用Counter统计词频
rank = sorted(counter.items(), key=lambda each: (-each[1], each[0]), reverse=False) # 按照词频递减排序
print(len(rank)) # 输出不同单词的个数
for each in rank[0:int(0.1*len(rank))]: # 输出词频最大的前10%的单词
    print("{}:{}".format(each[1], each[0]))

在这里插入图片描述

函数练习题

第6章函数-1 使用函数求特殊a串数列和 (10 分)

题目

给定两个均不超过9的正整数a和n,要求编写函数fn(a,n) 求a+aa+aaa++⋯+aa⋯aa(n个a)之和,fn须返回的是数列和

函数接口定义:

fn(a,n)
其中 a 和 n 都是用户传入的参数。 a 的值在[1, 9]范围;n 是[1, 9]区间内的个位数。函数须返回级数和

裁判测试程序样例:

/* 请在这里填写答案 */
a,b=input().split()
s=fn(int(a),int(b))
print(s)

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

2 3

输出样例:
在这里给出相应的输出。例如:

246

解答

def fn(a,n):
    ans=0
    num=0
    while n:
        num=num*10+a
        ans+=num
        n-=1
    return ans

image.png

第6章函数-2 使用函数求素数和 (20 分)

题目

使用函数求素数和

prime§, 其中函数prime当用户传入参数p为素数时返回True,否则返回False. PrimeSum(m,n),函数PrimeSum返回区间[m, n]内所有素数的和。题目保证用户传入的参数1<=m<n。

函数接口定义:

在这里描述函数接口:
prime§,返回True表示p是素数,返回False表示p不是素数
PrimeSum(m,n),函数返回素数和

裁判测试程序样例:

/* 请在这里填写答案 */
m,n=input().split()
m=int(m)
n=int(n)
print(PrimeSum(m,n))

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

1 10

输出样例:
在这里给出相应的输出。例如:

17

解答

import math


def prime(p):
    p = int(p)
    if p == 1:
        return False
    for i in range(2, int(math.sqrt(p))+1):
        if p % i == 0:
            return False
    return True


def PrimeSum(m, n):
    ans = 0
    for i in range(m, n+1):
        if prime(i):
            ans += i
    return ans

image.png

第6章函数-3 使用函数统计指定数字的个数 (20 分)

题目

本题要求实现一个统计整数中指定数字的个数的简单函数。
CountDigit(number,digit )

其中number是整数,digit为[1, 9]区间内的整数。函数CountDigit应返回number中digit出现的次数。

函数接口定义:

在这里描述函数接口。例如: CountDigit(number,digit ),返回digit出现的次数

裁判测试程序样例:

/* 请在这里填写答案 */
number,digit=input().split()
number=int(number)
digit=int(digit)
count=CountDigit(number,digit )
print(“Number of digit 2 in “+str(number)+”:”,count)

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

-21252 2

输出样例:
在这里给出相应的输出。例如:

Number of digit 2 in -21252: 3

解答

def CountDigit(number, digit):
    count = 0
    number = abs(number)
    while number != 0:
        if number % 10 == digit:
            count += 1
        number = number//10
    return count

image.png

第6章函数-4 使用函数输出指定范围内Fibonacci数的个数 (20 分)

题目

本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m<n≤100000)之间的所有Fibonacci数的数目。

所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列,fib(0)=fib(1)=1。其中函数fib(n)须返回第n项Fibonacci数;函数PrintFN(m,n)用列表返回[m, n]中的所有Fibonacci数。

函数接口定义:

在这里描述函数接口。
例如:
fib(n),返回fib(n)的值
PrintFN(m,n),用列表返回[m, n]中的所有Fibonacci数。

裁判测试程序样例:

在这里给出函数被调用进行测试的例子。
例如:
/* 请在这里填写答案 */
m,n,i=input().split()
n=int(n)
m=int(m)
i=int(i)
b=fib(i)
print(“fib({0}) = {1}”.format(i,b))
fiblist=PrintFN(m,n) print(len(fiblist))

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

20 100 6

输出样例:
在这里给出相应的输出。例如:

fib(6) = 13 4

解答

def fib(n):
    a = 0
    b = 1
    while n:
        a, b = b, a+b
        n -= 1
    return b


def PrintFN(m, n):
    count = []
    index = 1
    while fib(index) <= n:
        if fib(index) >= m:
            count.append(fib(index))
        index += 1
    return count

image.png

第6章函数-5 使用函数求余弦函数的近似值 (20 分)

题目

本题要求实现一个函数,用下列公式求cos(x)近似值,精确到最后一项的绝对值小于eps(绝对值小于eps的项不要加):
cos(x)=0!x0−2!x2+4!x4−6!x6+…
image.png

函数接口定义:funcos(eps,x ),其中用户传入的参数为eps和x;函数funcos应返回用给定公式计算出来,保留小数4位。

函数接口定义:

函数接口: funcos(eps,x ),返回cos(x)的值。

裁判测试程序样例:

在这里给出函数被调用进行测试的例子。
例如:
/* 请在这里填写答案 */
eps=float(input())
x=float(input())
value=funcos(eps,x )
print(“cos({0}) = {1:.4f}”.format(x,value))

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

0.0001 -3.1

输出样例:
在这里给出相应的输出。例如:

cos(-3.1) = -0.9991

解答

def funcos(eps, x):
    n = 1
    a = 1
    b = 1
    flag = -1
    ans = 1
    while a/b >= eps:
        n += 1
        count = (n-1)*2
        a = math.pow(x, count)
        b = math.factorial(count)
        if a/b >= eps:
            ans = ans+flag*(a/b)
        flag *= -1
    return ans

image.png

第6章函数-6 缩写词 (20 分)

题目

缩写词是由一个短语中每个单词的第一个字母组成,均为大写。例如,CPU是短语“central processing unit”的缩写。

函数接口定义:

acronym(phrase); phrase是短语参数,返回短语的缩写词

裁判测试程序样例:

/* 请在这里填写答案 */
phrase=input()
print(acronym(phrase))

输入样例:

central processing unit

输出样例:

CPU

解答

def acronym(phrase):
    lst=list(phrase.split())
    ans=""
    for i in lst:
        ans+=i[0].upper()
    return ans

image.png

结语

题目来自PTA平台

文章仅作为学习笔记,记录从0到1的一个过程

希望对您有所帮助,如有错误欢迎小伙伴指正~

我是 海轰ଘ(੭ˊᵕˋ)੭

如果您觉得写得可以的话,请点个赞吧

谢谢支持 ️

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44225182/article/details/119753345

智能推荐

python3中cv2.imread返回NoneType的解决方法-程序员宅基地

文章浏览阅读2.4k次,点赞2次,收藏6次。这两天做东西真是诸事不顺,caffe各种爆炸,今天在转换数据集格式的时候python又炸了,具体情况如下:环境anacond3,python3,opencv3,代码中cv2.imread(train_filepath)后返回NoneType,百度了一圈大都是说路径不对,opencv-python包不对之类的问题,于是我仔细检查各种路径没有问题后,将anaconda到各种包全update了一...

ESP32 Arduino引脚分配参考:您应该使用哪些 GPIO 引脚?_esp32引脚分配指南-程序员宅基地

文章浏览阅读931次。但是,如果您有外设连接到这些引脚,则在尝试上传新代码、使用新固件刷新 ESP32 或重置开发板时可能会遇到困难。如果您有一些外设连接到捆绑引脚,并且您在上传代码或刷新 ESP32 时遇到问题,可能是因为这些外设阻止了 ESP32 进入正确的模式。由于 ESP32 芯片的多路复用功能,这是可能的。这意味着,如果您有连接到这些 GPIO 的输出,则当 ESP32 重置或启动时,您可能会得到意外的结果。并非所有开发板都可以访问所有 GPIO,但无论您使用哪种开发板,每个特定 GPIO 都以相同的方式工作。_esp32引脚分配指南

智能手机芯片天梯图片_联发科的骄傲——天玑1000 网友自制手机SoC天梯图排名前列...-程序员宅基地

文章浏览阅读2.7w次。11月28日消息,今日,有网友在微博上晒出一张手机芯片的天梯图,并重点赞扬了位于顶端的天玑1000芯片。该芯片是联发科于前日正式发布的旗下首款旗舰级5G集成芯片,且预计搭载它的首款终端设备将于2020年第一季度发售。天玑1000以北斗七星之一的名字命名,象征该芯片是5G时代的领跑者,事实上该芯片也确实性能强悍。在安兔兔跑分数据中,搭载该处理器的手机跑分高达511363,这是麒麟990和骁龙855 ..._天玑1000天梯图

torch.cat() 使用详解_torch.cat 会重新申请内存吗-程序员宅基地

文章浏览阅读909次。官方文档torch.cat(inputs, dimension=0) → Tensor在给定维度上对输入的张量序列seq 进行连接操作。torch.cat()可以看做 torch.split() 和 torch.chunk()的反操作。参数:inputs (sequence of Tensors) – 可以是任意相同Tensor 类型的python 序列dimension (int, optional) – 沿着此维连接张量序列。cat() 函数可以通过下面例子更好的理解。官方例子>_torch.cat 会重新申请内存吗

oracle怎么改字符编码格式,Oracle修改字符编码-程序员宅基地

文章浏览阅读2.3k次。在操作数据库的时候,需要 根据 实际情况,修改数据库的编码 ,如下提供一个修改数据库的编码过程。 查看数据库当前编码: select userenv('language') from dual; 在windows的命令 窗口,输入 cmd 打开do s窗口。 输入:sqlplus/nolo g 打开数据连接 ;输入在操作数据库的时候,需要根据实际情况,修改数据库的编码,如下提供一个修改数据库的编码..._oracle设置编码格式

.net是什么-程序员宅基地

文章浏览阅读2.6w次,点赞2次,收藏8次。距离学习.net有一年了。直到前段时间的面试中,才发现对.net的理解有很多的问题。当时在网上简单地查了一下,大概了解了一下。现在我徒弟反映.net视频有很多不理解的地方,我们讨论了一下,也给了我一个很好的再学习机会。下面是我对.net的再理解。_net

随便推点

web前端面试题及答案整理(一)_在javascript中,如果执行语句math.round(7.25),则得到-程序员宅基地

文章浏览阅读3.4k次,点赞5次,收藏18次。web前端、HTML、CSS、JavaScript、DOM_在javascript中,如果执行语句math.round(7.25),则得到

Android app版本升级的一个简单实现_安卓versioncode 升级-程序员宅基地

文章浏览阅读7.7k次。1升级原理build.gradle 中 versionCode 1 , versionName “1.0.0” 是升级的关键,versionCode是个int,versionName是个String,其中versionCode每次要升级版本都需要+1,VersionName是给用户看的,让用户知道当前版本。升级原理:从服务器获取升级信息,包括versionCode,versionN..._安卓versioncode 升级

windows下查看端口被什么程序占用-程序员宅基地

文章浏览阅读73次。为什么80%的码农都做不了架构师?>>> ..._windows查看端口被哪个进程占用

mugen linux主程序,Mugen主程序报错汇总-程序员宅基地

文章浏览阅读4.8k次。原文来自11区民间整合的Mugen主程序报错汇总,同时加入了千寻网站平时收集的常见报错,源地址:http://mugenbinran.web.fc2.com/error.html以下皆为机翻,有空会慢慢修正翻译加载初始场景报错报错关键字:dojo.def 或 stage0.def原因:程序以debug模式运行且调用了debug场景解决方法:1、在mugen.cfg文件内找到[Debug]下的Sta..._mugen报错

python用matplotlib画折线图_from matplotlib import pyplot as plt x=range(2,26,-程序员宅基地

文章浏览阅读304次。1、from matplotlib import pyplot as pltx=range(2,26,2)y=[15,13,14.5,17,20,25,26,26,24,]22,18,15fig=plt.figure(figsize=(20,8),dpi=80)#设置图片大小plt.plot(x,y)#plt.xticks(x)#设置x轴刻度plt.xticks(range(2..._from matplotlib import pyplot as plt x=range(2,26,2) y=[15,13,14,17,20,26,26

热风枪使用之碳化温度_碳火加风枪温度-程序员宅基地

文章浏览阅读497次。_碳火加风枪温度

推荐文章

热门文章

相关标签