解题思路:
矩阵A的M次幂的两种情况:
一. 幂M为0
结果为单位矩阵。
何为单位矩阵,维基百科讲解的非常好:
https://zh.wikipedia.org/wiki/%E5%96%AE%E4%BD%8D%E7%9F%A9%E9%99%A3
二. 幂不为0
按照题意,矩阵A的M次幂就是A自己和自己相乘了M次,
A X A = Result ......
这其中得多次借用临时矩阵存储,类似两数交换借助第三个变量。
由于矩阵阶数小于30,那么咱们来定义3个矩阵:
a[30][30] b[30][30] c[30][30]
a x b = c b矩阵中存放a矩阵最原始的值, 最终结果放在c矩阵中。
下一次相乘时,要把c矩阵中的值全部拷贝到a矩阵,
a = c
再执行 a X b = c时,这里面的a是上一次矩阵相乘的结果
算法就是 a x b =c 结果存在c 中 再a=c 把结果传给a 再 a x b就是上一次的结果(已赋给a)再乘以a最原始的(b矩阵),不断进行下去
................
注意事项:
线性代数学的有好长时间了,很多知识点容易淡忘。
开始我以为矩阵的幂就是矩阵内部数的幂。
如
1 2 的 2次幂为 1 4
3 4 9 16
这是一个严重的错误.........
正确理解矩阵乘法参考维基百科:
https://zh.wikipedia.org/wiki/%E7%9F%A9%E9%99%A3%E4%B9%98%E6%B3%95
参考代码:
#include <stdio.h> #include <math.h> #include <string.h> int main() { int a[30][30],b[30][30],c[30][30]; int N,M; scanf("%d%d",&N,&M); for(int i=0; i<N; i++) //给数组 a 赋值 { for(int j=0; j<N; j++) { scanf("%d",&a[i][j]); b[i][j]=a[i][j]; } } if(M==0) //M=0 , N阶矩阵的 0 次幂为单位矩阵 { for(int i=0; i<N; i++) { for(int j=0; j<N; j++) { if(i==j) a[i][j]=1; else a[i][j]=0; printf("%d ",a[i][j]); } printf("\n"); } } else //幂数非0的情况 { for(int i=1; i<M; i++) //此层循环控制 m次幂 { memset(c,0,sizeof(c)); for(int x=0; x<N; x++) { for(int y=0; y<N; y++) { for(int z=0; z<N; z++) { c[x][y] += a[x][z]*b[z][y]; } } } for(int i=0; i<N; i++) { for(int j=0; j<N; j++) { a[i][j] = c[i][j]; } } } for(int i=0; i<N; i++) { for(int j=0; j<N; j++) { printf("%d ",c[i][j]); } putchar('\n'); } } return 0; }
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复