题目链接
题目详情
给定两个矩阵和,要求你计算它们的乘积矩阵。需要注意的是,只有规模匹配的矩阵才可以相乘。即若有行、列,有行、列,则只有与相等时,两个矩阵才能相乘。
输入格式:
输入先后给出两个矩阵和。对于每个矩阵,首先在一行中给出其行数和列数,随后行,每行给出个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的和都是正数,并且所有整数的绝对值不超过100。
输出格式:
若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵,否则输出Error: Ca != Rb,其中是的列数,是的行数。
输入样例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
解题思路
这题大家学过线性代数的都能理解,就是矩阵的乘法,矩阵A * 矩阵B的前提是A的列数等于B的行数。且最终的得到的矩阵的型由A的行和B的列决定。即A(2 * 3) * B(3 * 3) -> AB(2 * 3)。
做题时先判断能否相乘,能的话继续。
做法是左边矩阵出行,右边矩阵出列,对应元素相乘,最后全部相加。
对应的代码如下
for (int j = 1; j <= Cb; j++)
{
int sum = 0;
int k;
for (k = 1; k <= Rb; k++)
{
sum += A[i][k] * B[k][j];
}
printf("%d", sum);
if (j != Cb)
{
printf(" ");
}
else
{
printf("\n");
}
}
AC代码
#include<iostream>
using namespace std;
int main()
{
int Ra = 0, Ca = 0, Rb = 0, Cb = 0;
int A[1000][1000], B[1000][1000];
cin >> Ra >> Ca;
for (int i = 1; i <= Ra; i++)
{
for (int j = 1; j <= Ca; j++)
{
cin >> A[i][j];
}
}
cin >> Rb >> Cb;
for (int i = 1; i <= Rb; i++)
{
for (int j = 1; j <= Cb; j++)
{
cin >> B[i][j];
}
}
if (Ca != Rb)
{
cout << "Error: " << Ca << " != " << Rb << endl;
}
else
{
cout<<Ra<<" "<< Cb << endl;
for (int i = 1; i <= Ra; i++)
{
for (int j = 1; j <= Cb; j++)
{
int sum = 0;
int k;
for (k = 1; k <= Rb; k++)
{
sum += A[i][k] * B[k][j];
}
printf("%d", sum);
if (j != Cb)
{
printf(" ");
}
else
{
printf("\n");
}
}
}
}
return 0;
}