蓝桥杯基础题--矩阵乘法个人解法

问题描述

  给定一个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()

新手参加比赛,当做训练笔记。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值