基础练习 矩阵乘法

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

/*矩阵的m次幂*/

#include <stdio.h>

#include <memory.h>

void matrix_multy(int matrix1[][30],int matrix2[][30], int n, int result[][30]){

    int i , j ,k;

    memset(result, 0, sizeof(result));

    for (i = 0; i < n; i++) {

        for (j = 0; j < n; j++) {

            for (k = 0; k < n; k++) {

            result[i][j] += matrix1[i][k] * matrix2[k][j];

            }

        }

    }

    return;

}

void matrix_copy(int matrix[][30],int n,int result[][30]){

    int i, j;

    for (i = 0; i < n; i++) {

        for (j = 0; j < n; j++) {

            result[i][j] = matrix[i][j];

        }

    }

}

int main(int argc, char ** argv){

    int matrix1[30][30];

    int result[30][30];

    int matrix2[30][30];

    memset(matrix1, 0, sizeof(matrix1));

    memset(matrix2, 0, sizeof(matrix2));

    memset(result, 0, sizeof(result));

    int i, j, n , m, first = 1;

    scanf("%d %d", &n, &m);

    for (i = 0; i < n; i++) {

        for (j = 0; j < n; j++) {

            scanf("%d", &matrix1[i][j]);

        }

    }

    if (m == 1) {

        matrix_copy(matrix1, n, result);

    }else if(m == 0 ){

        for (i = 0, j = 0; i < n; i++,j++) {

            result[i][j] = 1;

        }

    }

    for (i = 0; i < m-1; i++) {

        if (first) {

            matrix_copy(matrix1, n, matrix2);

            first = 0;

        }else{

            matrix_copy(result, n, matrix2);

            memset(result, 0, sizeof(result));

        }

        matrix_multy(matrix1, matrix2, n, result);

    }

    for (i = 0; i < n; i++) {

        for (j = 0; j < n; j++) {

            printf("%d ", result[i][j]);

        }

        printf("\n");

    }

    return 0;

}

/*

 总结:

 1.注意考虑问题的全面性,不要忘记考虑0次和一次幂

 */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值