【GPLT】L1-048 矩阵A乘以B
题目描述:
给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有Ra行、Ca列,B有Rb行、Cb列,则只有Ca与Rb相等时,两个矩阵才能相乘。
输入描述:
输入先后给出两个矩阵A和B。对于每个矩阵,首先在一行中给出其行数R和列数C,随后R行,每行给出C个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的R和C都是正数,并且所有整数的绝对值不超过100。
输出描述:
若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb,其中Ca是A的列数,Rb是B的行数。
输入样例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的行不相等,直接输出Error: Ca != Rb。否则,令矩阵A乘以矩阵B的结果为矩阵res。矩阵res中的第i行第j列的元素值为矩阵A的第i行每个元素乘以矩阵B的第j列的每个元素的积。注意输出格式哦!
AC代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int Ra,Ca; //矩阵A的行数Ra和列数Ca
cin >> Ra >> Ca;
int A[Ra][Ca];
for(int i = 0; i < Ra; i++)
{
for(int j = 0; j < Ca; j++)
{
cin >> A[i][j];
}
}
int Rb,Cb; //矩阵B的行数Rb和列数Cb
cin >> Rb >> Cb;
int B[Rb][Cb];
for(int i = 0; i < Rb; i++)
{
for(int j = 0; j < Cb; j++)
{
cin >> B[i][j];
}
}
int res[Ra][Cb]; //结果矩阵
memset(res,0,sizeof(res));
if(Ca != Rb) //若Ca和Rb不相等,说明矩阵A和矩阵B不能相乘
{
printf("Error: %d != %d\n",Ca,Rb);
}
else
{
bool isVirgin = true; //判断是不是第一次
cout << Ra << " " << Cb << endl;
for(int i = 0; i < Ra; i++)
{
for (int j = 0; j < Cb; j++)
{
for (int k = 0; k < Ca; k++) //A矩阵每一行的元素依次乘上B矩阵每一列的元素
{
res[i][j] += A[i][k]*B[k][j];
}
if(isVirgin)
{
cout << res[i][j];
isVirgin = false;
}
else
{
cout << " " << res[i][j];
}
}
isVirgin = true; //修复成第一次
cout << endl;
}
}
return 0;
}
原文链接:【GPLT】L1-048 矩阵A乘以B
麦芽雪冷萃 版权所有,转载请注明出处。
还没有任何评论,你来说两句吧!