一.题目
题目链接
http://lx.lanqiao.cn/problem.page?gpid=T58
问题描述
给定一个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
二.解决
思路:使用三个矩阵,c矩阵为结果矩阵,a矩阵为原矩阵,b矩阵为暂时存放当前计算数据的c矩阵。对于c[i][j]+=c[i][h]*c[h][j](h从1到n)
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 using namespace std; 7 int a[35][35],b[35][35],c[35][35];//b矩阵初始为单位矩阵 8 int N,M; 9 10 void Myprint(int b[][35]){ //输出数组的值 11 for(int i=1;i<=N;i++){ 12 for(int j=1;j<=N;j++){ 13 if(j!=N) cout<<b[i][j]<<" "; 14 else cout<<b[i][j]<<endl; 15 } 16 } 17 } 18 void Fun(int b[][35],int c[][35]){ //将b数组的值赋给c数组 19 for(int i=1;i<=N;i++){ 20 for(int j=1;j<=N;j++){ 21 c[i][j]=b[i][j]; 22 } 23 } 24 } 25 int main(){ 26 cin>>N>>M; 27 28 for(int i=1;i<=N;i++){ 29 for(int j=1;j<=N;j++){ 30 cin>>a[i][j]; 31 c[i][j]=a[i][j];//a数组与c数组为矩阵A 32 if(i==j) b[i][j]=1;//b数组为单位矩阵 33 else b[i][j]=0; 34 } 35 } 36 if(M==0) Myprint(b);//输出单位矩阵 37 else if(M==1) Myprint(a); 38 else{ 39 for(int t=2;t<=M;t++){//M次方 40 //注意:对于每次a矩阵与c矩阵的计算结果先由b数组存储,因为若用c数组存储,计算时会冗杂在一起,使得结果错误 41 for(int i=1;i<=N;i++){ 42 for(int j=1;j<=N;j++){ 43 for(int h=1;h<=N;h++){ 44 if(h==1) b[i][j]=c[i][h]*a[h][j]; 45 else b[i][j]+=c[i][h]*a[h][j]; 46 } 47 } 48 } 49 Fun(b,c);//把b数组的值赋给c数组 50 } 51 Myprint(c); 52 } 53 return 0; 54 }