问题描述
给定一个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
本题算法思路:
线性代数矩阵相乘。如果不知道矩阵相乘公式,可以尝试列出来找规律。难道每一次相乘都要初始化一个新数组吗?不是。只需两个数组相乘得到第三个数组,不断用第三个数组赋值给第二个数组,再用第二个数组乘上第一个数组即可,最终输出第二个数组的值。
完整代码:
#include<stdio.h>
int main(){
int a[35][35];
int b[35][35];
int c[35][35];
int i, j;
int n ,m ,k ,z;//n行,m次幂 ,k 第几个元素 ,z遍历几次幂
scanf("%d%d",&n,&m);
for(i = 1 ; i <= n ; i++){
for(j = 1 ; j <= n; j++){
scanf("%d",&a[i][j]);
b[i][j] = a[i][j];
c[i][j] = 0;
}
}
//当 m = 0, 单位 矩阵
//单位矩阵 对角线为 1,其他 为 0
if(m == 0){
for(i = 1 ; i <= n ; i++){
for(j = 1 ; j <= n; j++){
if(i == j)
b[i][j] = 1;
else
b[i][j] = 0;
}
}
}
//等于本身
else if(m == 1){
for(i = 1 ; i <= n ; i++){
for(j = 1 ; j <= n; j++){
printf("%d ",b[i][j]);
}
}
}
else if(m >= 2 ){
for(z = 2 ; z <= m; z++){
for(i = 1; i <= n; i++){
for(j = 1; j <= n; j++){
for(k = 1; k <= n; k++){
c[i][j] += a[i][k] * b[k][j];
}
}
}
//更新数组
for(i = 1 ; i <= n; i++){
for(j = 1; j <= n; j++){
b[i][j] = c[i][j];
c[i][j] = 0;
}
}
}
}
for(i = 1 ; i <= n; i++){
for(j = 1; j <= n; j++){
printf("%d ",b[i][j]);
}
printf("\n");
}
return 0;
}