0
点赞
收藏
分享

微信扫一扫

浙大python习题超详细思路(第四章下)

彭维盛 2022-04-21 阅读 52
python

人生苦短,我用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")
举报

相关推荐

0 条评论