Python刷题
题目:第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
一、代码
t = int(input())
for i in range(t):
flag = 1
n = int(input())
for j in range(n):
a = list(map(int,input().split()))
for b in range(j):
if a[b] != 0:
flag = 0
break
if flag == 1:
print('YES')
else:
print('NO')
二、心得
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):
s=input()
a.append([int(n) for n in s.split()])
for i in range(n):
for j in range(n):
flag=True
if a[i][j]==max(a[i]):#第(i,j)是该行max
for k in range(n):
if a[i][j]>a[k][j]:#判断是不是该列min
flag=False
break
if flag==True:
print(i,j)
exit()
print('NONE')
二、心得
1.矩阵知识的掌握以及算法表达
2 a.append(value) 在列表尾中插入成员
题目:第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):
s=input()
a.append([int(b) for b in s.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("{} {} {}".format("None",m,n))
二、心得
- 列表巧妙赋值方法: a.append([int(b) for b in s.split()])
- 二维矩阵的算法实现思想
题目:第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,i+1):
print('{:d}*{:d}={:<4d}'.format(j,i,i*j),end="")
print("")
二、心得
对于规定输出间隔多少通过 print( “{:<Td}”.format(a) ) 右对齐T个单位输出a
题目:第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())
a=0
for i in range(n):
for j in range(n-i):
print(chr(65+a),end=" ")
a+=1
print("")
二、心得
题目:第4章-26 求1!+3!+5!+……+n! (10 分)
求1!+3!+5!+……+n!的和,要求用循环嵌套设计,n<12。
输入格式:
输入在一行中给出一个不超过12的正整数n。
输出格式:
在一行中按照格式“n=n值,s=阶乘和”的顺序输出,其中阶乘和是正整数。
输入样例:
5
输出样例:
n=5,s=127
一、代码
import math
n = int(input());s = 0
for i in range(1,n+1,2):
s += math.factorial(i)
print("n = {},s = {}".format(n,s))
二、心得
内置函数math.factorial(s) 求s阶乘
题目:第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
一、代码
arr = list(map(int, input().split()))
for i in range(0,7,3):
for j in arr[i:i+3]:
print('{:>4}'.format(j),end='')
print('{:>4}{:>4}'.format(max(arr[i:i+3]), sum(arr[i:i+3])))
二、心得
1.print(’{:>T}’.format(a),end=’’) 间隔T个单位输出a,**end=""**表示不过段
2. max(lst) 求lst最大的值
题目:第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
一、代码
s=list(map(int,input().split()))
for i in range(0,3):
print("{:>4}{:>4}{:>4}".format(s[i],s[i+3],s[i+6]))
二、心得
print(’{:>T}’.format(a),end=’’) 间隔T个单位输出
题目:第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
一、代码
tep=list(input().split()[1:])
tep1=list(input().split()[1:])
a,b=set(tep),set(tep1)
tep.extend(tep1)
print(' '.join(sorted(list(a^b),key=tep.index)))
二、心得
1.extend() 函数用于在列表末尾一次性追加另一个序列中的多个值
2.. join (): 连接字符串数组
3sorted () 是对序列(列表、元组、字典、集合、还包括字符串)进行排序。
题目:第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
def wq(x):
lst = [1]
result = 0
for j in range(2,int(math.sqrt(x))+1):
if x%j == 0:
lst.append(j)
lst.append(x//j)
if sum(lst) == x:
lst.sort()
print('{} = {}'.format(x," + ".join('%s' %id for id in lst)))
result = 1
return result
m,n=input().split()
m = int(m)
n = int(n)
count = 0
for i in range (m,n+1):
if wq(i) == 1:
count += 1
if count == 0:
print('None')
二、心得
1.**math.sqrt(x)**取根号
2. lst.append(value) 列表lst末尾追加value
3. sum(lst) 求lst总和
4. a//b 取整除
5. . join (): 连接字符串数组