人生苦短,我用python
#pat习题网址
https://pintia.cn/problem-sets/1111652100718116864/problems/type/1
浙大python习题\第4章\16.判断能否构成三角形.py
#输入三角形的三边,判断是否能构成三角形。若能构成输出yes,否则输出no。
lst = list(map(int,input().split()))
lst.sort() #将列表升序排列
if lst[0] + lst[1] > lst[2]: #只用判断两个小边的和是否大于最大的那个边
print("yes") #为啥?你把不等式移个项就是最大边-最小边<中间的边
else:
print("no")
浙大python习题\第4章\17,水仙花数.py
#水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。
# 例如:153=1×1×1+5×5×5+3×3×3。本题要求编写程序,计算所有N位水仙花数。
n=int(input())
for i in range(10**(n-1),10**n):
if i==sum([int(a)**n for a in str(i)]):
print(i) #每输出一个数会自动换行的
浙大python习题\第4章\18.猴子选大王.py
#一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。
# 从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始
# 同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
n=int(input())
ls=[i for i in range(1, n+1)] #把这些号数放入列表
c=0
while len(ls)>1:
for i in ls[:]:#虽然经过remove(), 但遍历还是保持原列表,不能用ls
c=c+1
if c==3: #把c=3时的i移除,下一个i的报的数就是1
c=0
ls.remove(i)
print(ls[0]) #列表里面就剩一个元素了,就直接输出第一个元素
浙大python习题\第4章\19.矩阵的数求和.py
# 给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所
# 有元素之和。副对角线为从矩阵的右上角至左下角的连线。
n = int(input()) #输入n阶
arr = [] #建一个列表
for i in range(n):
arr.append(list(map(int, input().split())))
#建一些列表追加到arr列表中,形成二维列表,这里每回车一次就追加一个新列表
total = 0
for i in range(n):
for j in range(n):
if i+j!=n-1 and i!=n-1 and j!=n-1:
total += arr[i][j] #n-1就表示 最后一列 最后一行
print(total)
浙大python习题\第4章\20.求矩阵各行之和.py
#输入格式:
# 输入第一行给出两个正整数m和n(1≤m,n≤6)。随后m行,每行给出n个整数,其间以空格分隔。
# 输出格式:
# 每行输出对应矩阵行元素之和。
m,n=map(int,input().split()) #m为行数,n为列数
a=[]
for i in range(m):
s=input().split()
a.append([int(l) for l in s])#把输入的数字变成列表再添加到a这个列表中,形成二维列表,也就是矩阵
for j in range(m):
sum=0
for k in range(n):
sum+=a[j][k] #[j][k]表示二维矩阵元素的下标,a[j][k]表示第j行第k列的那个元素
print(sum) #这个print是"for j in range(m):"的输出不是内层循环的输出
浙大python习题\第4章\21.@判断是否为上三角矩阵.py
#输入格式:
# 输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第
# 一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。
# 输出格式:
# 每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。
n=int(input()) #输入待测矩阵的个数
for i in range(0,n):
t=int(input()) #输入矩阵的行列数
num=[]
f = 0 #方便后面输出yes或no
for j in range(0,t):
lst=list(map(int,input().split())) #将输入的数字变成列表
num.append(lst) #追加到num里,形成二维列表
for j in range(n):
for k in range(n):
if j > k: # 元素下标j > k的就是下三角区的
if num[j][k] != 0: #num[j][k]表示矩阵第j+1行第k+1列的元素
f = 1 #如果下三角区的元素不全为0,就不是上三角矩阵
if f == 0:
print('Yes')
else:
print('No')
浙大python习题\第4章\22.@找方阵鞍点.py
#一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
#本题要求编写程序,求一个给定的n阶方阵的鞍点。
t=int(input())
a=[]
for i in range(t):
a.append([int(p) for p in input().split()]) #意思同前面几道题
f=0
for i in range(t):
for j in range(t):
if a[i][j]==max(a[i]) and a[i][j]==min( [c[j] for c in a]):#元素值在该行上最大、在该列上最小
f=1
print(i,j) #当鞍点存在时就输出行列数
if f==0:
print("NONE")
浙大python习题\第4章\23.@求矩阵的局部最大值.py
#给定M行N列的整数矩阵A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,
#那么就称元素A[i][j]是矩阵的局部极大值。求给定矩阵的全部局部极大值及其所在的位置。
m,n = map(int,input().split()) #输入行列数
lis = []
s=0
for i in range(m):
lis.append([i for i in list(map(int,input().split()))][:n]) #建立二维列表
for y in range(1,m-1):
for x in range(1,n-1):
if lis[y][x-1] < lis[y][x] > lis[y][x+1] and lis[y-1][x] < lis[y][x] >lis[y+1][x]:
#A的非边界元素A[i][j]大于相邻的上下左右4个元素
print(lis[y][x],y+1,x+1); s = 1
#输出极大值和它的行列号
if s != 1:
print("NONE",m,n)
浙大python习题\第4章\24.打印九九乘法表.py
#输入格式:
# 输入在一行中给出一个正整数N(1≤N≤9)。
# 输出格式:
# 输出下三角N*N部分口诀表,其中等号右边数字占4位、左对齐。
n=int(input())
for i in range(1,n+1): #就用普通的嵌套循环
for j in range(1,i+1):
s=i*j
print(f'{i}*{j}={s:<4d}',end="") #end=""用于使每输出一个等式只是空一格,而不是换行
print("") #i每变一个值就换一行,用于外层for循环
浙大python习题\第4章\25.@输出三角形字符矩阵.py
#输入格式:
# 输入在一行中给出一个正整数n(1≤n<7)。
# 输出格式:
# 输出n行由大写字母A开始构成的三角形字符阵列。格式见输出样例,其中每个字母后面都有一个空格。
n=int(input())
a=0
for i in range(n):
for j in range(n-i):
print(chr(65+a),end=" ")#用ascll码表示大写字母方便,65表示A,以此类推
a+=1
print("") #是外层for循环输出
浙大python习题\第4章\26.求阶乘之和.py
#求1!+3!+5!+……+n!的和,要求用循环嵌套设计,n<12
import math #后面要用求阶乘的函数,它在math模块中
n=int(input())
s=0
for i in range(1,n+1,2):
s=s+math.factorial(i) #math.factorial(i)用于返回i的阶乘
print('n={:d},s={:d}'.format(n,s))
#为什么没用循环嵌套,因为这样简单
浙大python习题\第4章\27.求二维数组每行最大值与和.py
# 输入格式:
# 在一行中输入9个小于100的整数,其间各以一个空格间隔
# 输出格式:
# 输出3行3列的二维数组,并在每行后面分别输出每行最大值和每行元素的和,每个数据输出占4列。
a = [int(i) for i in input().split()] #直接把输入的数字放入列表
for i in range(3):
m=max(a[i*3:i*3+3])
#求每一行的最大值,也可以写成m=max(a[i*3],a[i*3+1],a[i*3+2])
s=sum(a[i*3:i*3+3])
print('{:4d}{:4d}{:4d}{:4d}{:4d}'.format(a[i*3], a[i*3+1], a[i*3+2], m, s))
#这里可以和第28题的转置矩阵的表示代码对比着看,第一行输出第1,2,3个数以此类推
浙大python习题\第4章\28.矩阵转置.py
# 将一个3×3矩阵转置(即行和列互换)。
# 输入格式:
# 在一行中输入9个小于100的整数,其间各以一个空格间隔。
# 输出格式:
# 输出3行3列的二维数组,每个数据输出占4列。
s=list(map(int,input().split())) #把9个数放入列表
for i in range(3):
print("{:>4} {:>4} {:>4}".format(s[i],s[i+3],s[i+6]))
#for每循环一次的输出就回车一次,所以每输出3个数就换行,第一行输出第1,4,7个数字,以此类推
浙大python习题\第4章\29.@找非共有元素.py
#给定两个整型数组,本题要求找出不是两者共有的元素。
n,m = list(input().split()),list(input().split())
lis = []
for j in n:
if j not in m:
lis.append(j)
for i in m:
if i not in n:
lis.append(i)
lis = list(set(lis)) #set用于去掉重复的数
print(*lis) #把列表变成字符串输出
浙大python习题\第4章\30.@找完数.py
#所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,
# 其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。
m,n=map(int,input().split())
ls=[]
ld=[]
for i in range(m,n+1):
for j in range(1,i):
if i%j==0:
ls.append(j)
if sum(ls)==i:
print(i,end='=')
ld.append(i)
for k in ls:
print(k,end="+" if k!=ls[-1] else "\n")
ls=[]
if not ld:
print("None")