原题链接:蓝桥杯基础练习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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复