解题思路:
矩阵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分
4 人评分
【金明的预算方案】 (C++代码)浏览:997 |
C语言程序设计教程(第三版)课后习题10.4 (C语言代码)浏览:583 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:490 |
用筛法求之N内的素数。 (C语言代码)浏览:711 |
printf基础练习2 (C语言代码)浏览:653 |
C语言程序设计教程(第三版)课后习题9.10 (C语言代码)浏览:866 |
大家好,我是验题君浏览:604 |
The 3n + 1 problem (C语言代码)浏览:550 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:497 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:476 |
cpython3 2020-01-28 23:35:13 |
完全可以AC啊,你难道看不懂C++吗