问题描述
给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
例如:
A =
1 2
3 4
A的2次幂
7 10
15 22
输入格式
第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数
接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值
输出格式
输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
样例输入
2 2
1 2
3 4
样例输出
7 10
15 22
N表示了咱们这题矩阵是个N行N列矩阵那么其代码实现很简单了
N, mi = map(int, input().split())
list1 = [[] for i in range(N)] # N行矩阵
for hang in range(N):
line = input().split()
for value in line: #每列赋值
list1[hang].append(int(value))
或者用
list1 = [list(map(int, input().split())) for i in range(N)]
现在目标矩阵已经生成,接下来就是求它的幂运算。由于蓝桥杯无法引入numpy库,所以幂运算只能我们手写代码了。其运算方法在线性代数里面有了详细介绍,此处就不赘述。重点是如何用代码将其实现。首先在草稿本上找找它的运算规律。
首先咱们考虑0次幂这个特殊情况,不论我们的目标矩阵如何,0次幂的结果一定是个对角全为1,其余为0的矩阵
elif mi == 0:
for hang in range(N):
for lie in range(N):
if hang == lie:
print(1,end=' ') # 正对角线全为1
else:
print(0,end=' ') # 其余位置全为0
print() #每一行结束要输入换行,满足题目的输出格式要求
然后考虑一下1次幂运算结果,就是输出他本身对吧,但是我们要注意一下输出格式要求:
if mi == 1:
for hang in range(N):
for lie in range(N):
print(list1[hang][lie], end=' ')
print()
接下来就是本题的实现难点了(高次幂)
可见其运算规律,蓝色圈内我们用for循环即可解决
所以我们可以拿出二次幂运算代码
for hang in range(N):
for lie in range(N):
flag = 0 # 存放每次变量的值
for value in range(N):
flag += list1[hang][value] * list1[value][lie]
res[hang].append(flag)
二次以上的幂我们就需要一个列表存放每一行运算结果的值了,待这一整行元素全部计算结束再赋值给res矩阵,否则会干扰这一行其他列的结果运算。
temp_list = [] # 相当于一维数组
for hang in range(N):
for lie in range(N):
flag = 0 # 存放每次变量的值
if lie ==0:
temp_list.append([]) # 每换一行,再添加一行数组与其对应
for value in range(N):
flag += res[hang][value] * list1[value][lie]
temp_list[hang].append(flag)
for hang in range(N):
for lie in range(N):
res[hang][lie] = temp_list[hang][lie] # 把结果赋值给res
虽然时间复杂度很高,但好在这个题所给的最高矩阵并不复杂,我们可以用时间换取代码复杂度。
N, mi = map(int, input().split())
list1 = [[] for i in range(N)] # N行矩阵
res = [[] for i in range(N)] # N行矩阵
erci = 0
for hang in range(N):
line = input().split()
for value in line: #每列赋值
list1[hang].append(int(value))
if mi == 1:
for hang in range(N):
for lie in range(N):
print(list1[hang][lie], end=' ')
print()
elif mi == 0:
for hang in range(N):
for lie in range(N):
if hang == lie:
print(1,end=' ') # 正对角线全为1
else:
print(0,end=' ') # 其余位置全为0
print() #每一行结束要输入换行,满足题目的输出格式要求
else:
while mi-1:
if erci ==0:
erci =1
for hang in range(N):
for lie in range(N):
flag = 0 # 存放每次变量的值
for value in range(N):
flag += list1[hang][value] * list1[value][lie]
res[hang].append(flag)
else:
temp_list = [] # 相当于一维数组
for hang in range(N):
for lie in range(N):
flag = 0 # 存放每次变量的值
if lie ==0:
temp_list.append([]) # 每换一行,再添加一行数组与其对应
for value in range(N):
flag += res[hang][value] * list1[value][lie]
temp_list[hang].append(flag)
for hang in range(N):
for lie in range(N):
res[hang][lie] = temp_list[hang][lie] # 把结果赋值给res
mi -=1
for hang in range(N):
for lie in range(N):
print(res[hang][lie],end=' ')
print()
新手参加比赛,当做训练笔记。