HZNUOJ 2003 矩阵乘法
题目描述
解题思路和注意点
本题是个简单的练习多层for循环以及二维数组读写的题目,难度不大,只需要运用线性代数中简单的矩阵乘法原理构建出结果的二维数组即可,需要注意的主要是输出的格式,以及C矩阵的大小是n*k,步骤如下:
- 读取题目所给的两个矩阵A和B ,用两个两层for循环实现即可;
- 定义出结果矩阵C,并初始化其中的值为0,以便后续的计算;
- 运用3层循环实现对矩阵C中各个位置的求值;
- 输出求得的矩阵C,输出注意换行和空格;
矩阵乘法的代码实现原理
在矩阵C中,C [ i ] [ j ] 的值取决于A矩阵的行和B矩阵的列,且下标从0开始有:
- C[i][j] = A[i][0]+B[0][j] + A[i][1]+B[1][j] +……+ A[i][k-1]+B[k-1][j]
用for循环来实现这个求和过程,即
for(int z=0;z<m;z++)
{
c[i][j]+=a[i][z]*b[z][j];
}
其中m是A的行数和B的列数,z变动时即对应的A[i][z]和B[z][j]相加
AC代码
#include<stdio.h>
#include<math.h>
#include<string.h>
int main(void)
{
int n,m,k;
int a[22][22],b[22][22],c[22][22];//a是第一个矩阵,b是第二个,c是相乘后的结果
//读入两个矩阵a和b
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<m;i++)
{
for(int j=0;j<k;j++)
{
scanf("%d",&b[i][j]);
}
}
//将c初始化
//其中c是nxk的矩阵,即c中i的范围是0-n,j的范围是0-k
for(int i=0;i<n;i++)
{
for(int j=0;j<k;j++)
{
c[i][j]=0;
}
}
//根据线代矩阵乘法的原理(行乘列)
for(int i=0;i<n;i++)
{
for(int j=0;j<k;j++)//外两层循环构建c
{
for(int z=0;z<m;z++)//第三层用来行乘列
{
c[i][j]+=a[i][z]*b[z][j];
}
}
}
//输出
for(int i=0;i<n;i++)
{
for(int j=0;j<k;j++)
{
printf("%d ",c[i][j]);
if(j==k-1) printf("\n");//判断换行
}
}
return 0;
}
此题不难,再接再厉!