问题描述
给定一个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){ 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){ for(i=0;i<n;i++){ for(j=0;j<n;j++) printf("%d ",a[i][j]); printf("\n"); } return 0; } while(m>=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]; k--; } } for(i=0;i<n;i++) for(j=0;j<n;j++){ b[i][j]=t[i][j]; 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:
