问题描述
给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
例如:
A =
1 2
3 4
A的2次幂
7 10
15 22
例如:
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个绝对值不超过10的非负整数,描述矩阵A的值
输出格式
输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
样例输入
2 2
1 2
3 4
1 2
3 4
样例输出
7 10
15 22
15 22
这个题其实就是求矩阵的乘方,在矩阵相乘的基础上循环,在网上看到很多复杂的也是优秀的代码,但是因为我个人目前水平有限只能写出依据原理实现的比较low的代码,
虽然low但是也算容易理解吧
代码如下:
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 5 int main() 6 { 7 int n, m; 8 cin >> n >> m; 9 int martix[n][n], result[n][n]; 10 for(int i=0;i<n;i++) 11 for(int j=0;j<n;j++) 12 { 13 cin >> martix[i][j]; 14 result[i][j] = martix[i][j]; 15 } 16 17 //方阵的0次幂为单位矩阵(左上角到右下角的对角线为1其他部分为0) 18 if(m==0) 19 { 20 for(int i=0;i<n;i++) 21 { 22 int flag=1; 23 for(int j=0;j<n;j++) 24 { 25 if(j==n-1) flag=0; 26 if(flag) //元素不是一行的最后一个 27 { 28 if(i==j) cout << 1 << " "; 29 else cout << 0 << " "; 30 } 31 else 32 { 33 if(i==j) cout << 1 ; 34 else cout << 0 ; 35 } 36 } 37 cout << endl; 38 } 39 }//if 40 41 else 42 { 43 //循环计算矩阵的乘方 44 for(int k=1;k<m;k++) 45 { 46 //临时数组保存计算结果: 47 int temp[n][n]; 48 memset(temp,0,sizeof(temp)); 49 50 //计算每次的乘积: 51 for(int i=0;i<n;i++) 52 for(int j=0;j<n;j++) 53 for(int s=0;s<n;s++) 54 { 55 temp[i][j] += result[i][s] * martix[s][j]; 56 } 57 58 //把每次计算出的结果赋给结果矩阵: 59 for(int i=0;i<n;i++) 60 for(int j=0;j<n;j++) 61 { 62 result[i][j] = temp[i][j]; 63 } 64 } 65 66 //按题目要求输出: 67 for(int i=0;i<n;i++) 68 { 69 for(int j=0;j<n;j++) 70 { 71 if(j!=n-1) 72 cout << result[i][j] << " "; 73 else 74 cout << result[i][j]; 75 } 76 cout << endl; 77 } 78 }//else 79 80 81 82 83 return 0; 84 }