矩阵A乘以B
给定两个矩阵AAA和BBB,要求你计算它们的乘积矩阵ABABAB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若AAA有RaR_aRa行、CaC_aCa列,BBB有RbR_bRb行、CbC_bCb列,则只有CaC_aCa与RbR_bRb相等时,两个矩阵才能相乘。输入格式:输入先后给出两个矩阵AAA和BBB。对于每个矩阵,首先在一行中给出其行数RRR和列数CCC,随后RRR行,每行给出CCC个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的RRR和CCC都是正数,并且所有整数的绝对值不超过100。输出格式:若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵ABABAB,否则输出Error: Ca != Rb,其中Ca是AAA的列数,Rb是BBB的行数。
输入样例1:
2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8
输出样例1:
2 4
20 22 24 16
53 58 63 28
输入样例2:
3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72
输出样例2:
Error: 2 != 3
Talk is cheap. Show me the code.
#include<iostream>
using namespace std;
int main()
{
int row_a=0,col_a=0;
cin>>row_a>>col_a;
int arr_a[row_a*col_a]={0};
for(int i=0;i<row_a*col_a;i++)
{
cin>>arr_a[i];
}
int row_b=0,col_b=0;
cin>>row_b>>col_b;
int arr_b[row_b*col_b]={0};
for(int i=0;i<row_b*col_b;i++)
{
cin>>arr_b[i];
}
if(col_a!=row_b)
{
cout<<"Error: "<<col_a<<" != "<<row_b;
return 0;
}
else
{
cout<<row_a<<" "<<col_b<<endl;
}
for(int i=0;i<row_a;i++)
{
for(int j=0;j<col_b;j++)
{
int sum=0;
for(int k=0;k<col_a;k++)
{
sum=sum+arr_a[k+i*col_a]*arr_b[j+k*col_b];
}
cout<<sum;
if(j<col_b-1)
{
cout<<" ";
}
}
cout<<endl;
}
}
解题思路
这个题主要就是如何寻找矩阵的坐标,因为矩阵相乘是用一行乘以另一个矩阵的一列,然后求和输出。
分步代码解释
1.
for(int i=0;i<row_a;i++)
{
for(int j=0;j<col_b;j++)
{
int sum=0;
for(int k=0;k<col_a;k++)
{
sum=sum+arr_a[k+i*col_a]*arr_b[j+k*col_b];
}
cout<<sum;
if(j<col_b-1)
{
cout<<" ";
}
}
cout<<endl;
}
外层循环是根据相乘后矩阵的行数输出,中层循环是根据相乘后矩阵的列数输出,内层循环是计算相乘后矩阵每一个数并输出。我只用了两个一维数组来存储矩阵,根据规律可以找到矩阵A每一行的坐标公式为k+icol_a,k指每一行的第几个数,icol_a指第几行;矩阵B每一列的坐标公式为j+kcol_b,j指第几列,kcol_b根据j得到这一列的数。sum求和输出即可。
易错点
1.
输出相乘后的矩阵时每一行最后不能有空格否则会出现格式错误。