蓝桥杯 基础练习 BASIC-17 矩阵乘法

试题 基础练习 基础练习 矩阵乘法

资源限制
时间限制:1.0s 内存限制:512.0MB

问题描述
给定一个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

Python 代码

nums = []
n, m = map(int, input().split())
for i in range(n):
    nums.append(list(map(int, input().split())))

if m == 0:  # 矩阵的零次幂为单位矩阵
    for i in range(n):
        for j in range(n):
            if i == j:
                print(1, end=' ')
            else:
                print(0, end=' ')
        print()
else:  # 模拟矩阵运算
    new_nums = nums
    ans_0 = [[0 for i in range(n)] for j in range(n)]
    ans = [[0 for i in range(n)] for j in range(n)]

    for t in range(m - 1):
        for i in range(n):
            for j in range(n):
                for k in range(n):
                    ans[i][j] = ans[i][j] + new_nums[i][k] * nums[k][j]

        new_nums = [[ans[i][j] for j in range(n)] for i in range(n)]
        if t < m-2:
            ans = [[0 for i in range(n)] for j in range(n)]

    for i in range(n):
        for j in range(n):
            print(ans[i][j], end=' ')
        print()

C/C++ 代码

#include<cstdio>

int main(){
    int n, m;
    int nums[35][35];
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            scanf("%d", &nums[i][j]);
        }
    }

    if (m == 0) {
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                if (i == j) {
                    printf("1 ");
                } else {
                    printf("0 ");
                }
            }
            printf("\n");
        }
    } else {
        // 矩阵乘法中 乘号左边的矩阵
        int new_nums[35][35];
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                new_nums[i][j] = nums[i][j];
            }
        }
        // 矩阵乘法的结果
        int ans[35][35] = {0};
        m--;
        while (m--) {
            for (int i = 0; i < n; ++i) {
                for (int j = 0; j < n; ++j) {
                    for (int k = 0; k < n; ++k) {
                        ans[i][j] += new_nums[i][k] * nums[k][j];
                    }
                }
            }

            // 将结果作为待乘矩阵
            for (int i = 0; i < n; ++i) {
                for (int j = 0; j < n; ++j) {
                    new_nums[i][j] = ans[i][j];
                }
            }

            if (m > 0) {
                for (int i = 0; i < n; ++i) {
                    for (int j = 0; j < n; ++j) {
                        ans[i][j] = 0;
                    }
                }
            }
        }
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                printf("%d ", ans[i][j]);
            }
            printf("\n");
        }
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值