0%

基础练习 矩阵乘法

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

–这个题其实不难,就是一开始我忘了矩阵乘法的相关知识Orz(⊙﹏⊙)

要注意分类讨论,矩阵的0次幂是单位矩阵,1次幂是矩阵本身,2+次幂就要借用另外两个数组来计算了。
在这里插入图片描述
AC代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
int a[35][35];
int b[35][35];
int t[35][35];

int main(){
int n,m,i,j,k;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
b[i][j]=a[i][j];
}
}
if(m==0){//矩阵的0次幂为单位矩阵
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(i==j)
printf("1 ");
else
printf("0 ");
}
printf("\n");
}
return 0;//要结束程序
}
if(m==1){//矩阵的1次幂为它本身
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;//要结束程序
}

while(m>=2){//矩阵2次幂及以上需要做运算
for(i=0;i<n;i++)
for(j=0;j<n;j++){
int k=n;
while(k){
t[i][j]+=b[i][k-1]*a[k-1][j];//t[i][j]作为中间数组
k--;
}
}
for(i=0;i<n;i++)
for(j=0;j<n;j++){
b[i][j]=t[i][j];//将中间计算得到的数组再赋给b[][],便于下一次乘法
t[i][j]=0;
}
m--;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d ",b[i][j]);
}
printf("\n");
}
return 0;
}

一定要注意当m=0和m=1时,要注意结束程序,不然会出错。
例如,输入10 0:
在这里插入图片描述

-------------本文结束感谢您的阅读-------------

欢迎关注我的其它发布渠道