问题描述
给定一个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
矩阵乘法规则加上中间数组桥梁作用就可以解决这个问题,但还是思考了很久。
代码实现:
1 #include<stdio.h> 2 int a[35][35],b[35][35],c[35][35]; 3 int main() 4 { 5 int N,M,i; 6 scanf("%d%d",&N,&M); 7 8 9 for(i=0;i<N;i++) 10 { 11 for(int j=0;j<N;j++) 12 scanf("%d",&a[i][j]); 13 } 14 15 16 for(int i=0;i<N;i++) 17 { 18 for(int j=0;j<N;j++) 19 b[i][j]=a[i][j]; 20 } 21 22 23 if(M==0) 24 { 25 for(i=0;i<N;i++) 26 c[i][i]=1;//单位矩阵主对角线的所有值为一; 27 } 28 else if(M==1) 29 { 30 for(int x=0;x<N;x++) 31 { 32 for(int y=0;y<N;y++) 33 c[x][y]=b[x][y]; 34 } 35 } 36 else if(M>=2) 37 { 38 for(int k=0;k<M;k++)//本身下来一次就可以充当一次幂了;在下来一次就是二次; 39 { 40 for(int x=0;x<N;x++) 41 { 42 for(int y=0;y<N;y++) 43 { 44 c[x][y]=b[x][y]; 45 b[x][y]=0; 46 } 47 } 48 for(int i=0;i<N;i++) 49 { 50 for(int j=0;j<N;j++) 51 { 52 for(int t=0;t<N;t++) 53 { 54 b[i][j]+=a[i][t]*c[t][j];//前一次矩阵乘法之后与原矩阵的乘法,需要中间数组b来当作桥梁 ,不能直接用a因为会改变原输入数组的值; 55 } 56 } 57 } 58 } 59 } 60 61 for(int i=0;i<N;i++) 62 { 63 for(int j=0;j<N;j++) 64 { 65 printf("%d ",c[i][j]); 66 } 67 printf(" "); 68 } 69 70 71 return 0; 72 }