原题链接:蓝桥杯基础练习VIP-矩阵乘法
解题思路: 每次都只计算目标矩阵的一个位置:a[i][j] = c[k][1]*b[k][j] (K的范围为 1 到 M,我这里矩阵的0号位置不用)
由于我们的M可能大于,我采用的是逐步上升的求法,先求M=2,再在这基础上继续求
注意事项: 要特别注意的就只当M=0时,矩阵是一个单位矩阵(对角线为1,其余为0),
再求M=3的时候其实是将M=2的乘以M=1的,所以我们需要保存刚开始输入的M=1的矩阵。
代码分解:
(1)定义的第一个函数:求某个位置幂上升一次的值
int add(int i,int j,int a[31][31],int b[31][31],int N){ //就是求你要的i行j列这个位置的“幂再上升一次”的值 int c=0; for (int k=1;k<=N;k++){ c+=a[i][k]*b[k][j]; } return c; }
(2)矩阵复制函数:因为我们这里有两处需要保留原来的矩阵
void cove(int c[31][31],int a[31][31],int N){ for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ c[i][j]=a[i][j]; } } }
(3)主函数:
int main() { int a[31][31],b[31][31],c[31][31]; int N,M; cin>>N>>M; for(int i=1;i<=N;i++){ for(int j=1;j>a[i][j]; } } cove(b,a,N);//用矩阵b保留我们刚开始的矩阵a,在我们M>2的情况下需要使用 int k=2; while(k<=M){ if(k==2){ for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ a[i][j]=add(i,j,b,b,N); } } } else { cove(c,a,N); // 重点,为什么需要这一步,为什么下面不直接a[i][j]=add(i,j,a,b,N)。 //因为在下面的两个for循环下矩阵a正在逐渐改变,所以我们需要保留原来的 for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ a[i][j]=add(i,j,c,b,N); } } } k++; }
完整参考代码:
#include<iostream> using namespace std; int add(int i,int j,int a[31][31],int b[31][31],int N){ int c=0; for (int k=1;k<=N;k++){ c+=a[i][k]*b[k][j]; } return c; } void cove(int c[31][31],int a[31][31],int N){ for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ c[i][j]=a[i][j]; } } } int main() { int a[31][31],b[31][31],c[31][31]; int N,M; cin>>N>>M; for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ cin>>a[i][j]; } } cove(b,a,N); int k=2; while(k<=M){ if(k==2){ for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ a[i][j]=add(i,j,b,b,N); } } } else{ cove(c,a,N); for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ a[i][j]=add(i,j,c,b,N); } } } k++; } if(M){ for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ cout<<a[i][j]<<" "; if(j==N) cout<<endl; } } } if(!M) { for(int i=1;i<=N;i++){ for(int j=1;j<=N;j++){ if(i==j) cout<<1<<" "; if(i!=j) cout<<0<<" "; if(j==N) cout<<endl; } } } return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复