蓝桥杯基础训练1571:矩阵乘法(C语言实现)
#include <stdio.h>
int n, m;
int a[31][31];
int b[31][31];
int c[31][31];
//矩阵a是原数据,不会变
//矩阵b是乘a后的矩阵,相当于个中间变量
//矩阵c是存放最后结果的矩阵
void f(void)
{
int i, j, times, sum, q=0;
//判断0次幂的情况,输出单位矩阵
if(m==0)
{
for(i=1; i<=n; ++i)
for(j=1; j<=n; ++j)
{
if(i==j)
a[i][j] = 1;
else
a[i][j] = 0;
}
for(i=1; i<=n; ++i)
{
for(j=1; j<=n; ++j)
printf("%d ", a[i][j]);
printf("\n");
}
return;
}
//如果1次幂就输出本身
if(m==1)
{
for(i=1; i<=n; ++i)
{
for(j=1; j<=n; ++j)
printf("%d ", a[i][j]);
printf("\n");
}
return;
}
//核心部分
for(times=1; times<m; ++times) //矩阵相乘的次数
{
for(i=1; i<=n; ++i) //行标,第i行,行数
for(q=1; q<=n; q++) //矩阵每一行都分别乘以全部列,共n列,每列一次
{
sum = 0; //初始化为零
for(j=1; j<=n; ++j)
sum += b[i][j]*a[j][q]; //经过一次行乘以列
c[i][q] = sum; //更新结果
}
for(i=1; i<=n; ++i)
for(j=1; j<=n; ++j)
b[i][j] = c[i][j]; //让矩阵b等于c,进行后续计算
}
//打印出结果
for(i=1; i<=n; ++i)
{
for(j=1; j<=n; ++j)
printf("%d ", c[i][j]);
printf("\n");
}
return;
}
int main(void)
{
int i, j;
scanf("%d %d", &n, &m);
//输入矩阵a
for(i=1; i<=n; ++i)
for(j=1; j<=n; ++j)
scanf("%d", &a[i][j]);
//赋值于矩阵b,让其和a相同
for(i=1; i<=n; ++i)
for(j=1; j<=n; ++j)
b[i][j] = a[i][j];
f();
return 0;
}
注释较偏向通俗,如有不足,请多指教,欢迎评论区留言。O(∩_∩)O