前言
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_⋯_a(n_个_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_、b、c,计算并输出面积和周长。注意:在一个三角形中, 任意两边之和大于第三边。三角形面积计算公式: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="")
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")
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
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")
提交代码 - 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")
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)
提交代码 - 2
str=input()
ans=[]
for i in str:
if i.isdigit():
ans.append(i)
print(int("".join(ans)))
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))
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)))
3-8 字符串逆序 (15 分)
题目
输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。
输入格式:
输入在一行中给出一个不超过80个字符长度的、以回车结束的非空字符串。
输出格式:
在一行中输出逆序后的字符串。
输入样例:
Hello World!
输出样例:
!dlroW olleH
解答
str=input()
print("{}".format(str[::-1]))
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))
提交代码 - 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))
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)
提交代码 - 2
str=input()
s="AEIOU"
count=0
for i in str:
if (i.isupper() == 1) and (i not in s):
count+=1
print(count)
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)
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))
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)
提交代码 - 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))
注意:
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)
3-15 统计一行文本的单词个数 (15 分)
题目
本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出单词个数。
输入样例:
Let’s go to room 209.
输出样例:
5
解答
str = input().split()
print(len(str))
3-16 删除重复字符 (20 分)
题目
本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。
输入格式:
输入是一个以回车结束的非空字符串(少于80个字符)。
输出格式:
输出去重排序后的结果字符串。
输入样例:
ad2f3adjfeainzzzv
输出样例:
23adefijnvz
解答
s = list(set(input()))
s.sort()
for i in s:
print(i,end="")
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))
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")
提交代码 - 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="")
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))
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)
提交代码 - 2
str = input()
str = str[::-1]
print(int(str))
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")
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)
第四章
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))
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))
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)
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
提交代码 - 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))
提交代码 - 2
N = int(input())
num = 1
sum = 1
for i in range(1, N+1):
num *= i
sum += 1/num
print("{:.8f}".format(sum))
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
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))
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))
提交代码 - 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")
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)))
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
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)
num = int(input())
a = 1
b = 1
while b < num:
a, b = b, a+b
print(b)
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
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))
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))
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")
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)
提交代码 - 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)
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)
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)
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
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")
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))
4-24 打印九九口诀表 (15 分)
题目
下面是一个完整的下三角九九口诀表:
11=1
12=2 22=4
13=3 23=6 33=9
14=4 24=8 34=12 44=16
15=5 25=10 35=15 45=20 55=25
16=6 26=12 36=18 46=24 56=30 66=36
17=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
12=2 22=4
13=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()
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
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))
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))
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()
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))
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")
优化后
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")
第五章
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])
5-2 图的字典表示 (20 分)
题目
图的字典表示。输入多行字符串,每行表示一个顶点和该顶点相连的边及长度,输出顶点数,边数,边的总长度。比如上图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))
5-3 四则运算(用字典实现) (30 分)
题目
四则运算(用字典实现),比较c语言的switch语句。
输入格式:
在一行中输入一个数字 在一行中输入一个四则运算符(+,-,*,/) 在一行中输入一个数字
输出格式:
在一行中输出运算结果(小数保留2位)
输入样例1:
在这里给出一组输入。例如:
7 / 3
输出样例1:
在这里给出相应的输出。例如:
2.33
输入样例2:
在这里给出一组输入。例如:
10 / 0
输出样例2:
在这里给出相应的输出。例如:
divided by zero
解答
参考:
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)
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))
提交代码 - 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)
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)
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]))
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))))
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))
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)
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])]))
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")
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)
第六章
6-1 输入列表,求列表元素和(eval输入应用) (10 分)
题目
在一行中输入列表,输出列表元素的和。
输入格式:
一行中输入列表。
输出格式:
在一行中输出列表元素的和。
输入样例:
[3,8,-5]
输出样例:
6
解答
提交代码 - 1
lst=eval(input())
print(eval('+'.join('%s' %id for id in lst)))
提交代码 - 2
print(sum(eval(input())))
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]))
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)
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)
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)
第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])
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))
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)
第七章
第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
解答
之前忘了做这道题 这次没有做出来 对一些库的函数掌握的还是不好 记不住
代码参考 :
# 导入库
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
第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
第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
第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
第6章函数-5 使用函数求余弦函数的近似值 (20 分)
题目
本题要求实现一个函数,用下列公式求cos(x)近似值,精确到最后一项的绝对值小于eps(绝对值小于eps的项不要加):
cos(x)=0!x0−2!x2+4!x4−6!x6+…
函数接口定义: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
第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
结语
题目来自PTA平台
文章仅作为学习笔记,记录从0到1的一个过程
希望对您有所帮助,如有错误欢迎小伙伴指正~
我是 海轰ଘ(੭ˊᵕˋ)੭
如果您觉得写得可以的话,请点个赞吧
谢谢支持 ❤️