题目描述
矩阵 A 规模为 n×m,矩阵 B 规模为 m×p,现在需要你求 A×B。
矩阵相乘的定义:
n×m的矩阵与 m×p 的矩阵相乘变成 n×p 的矩阵,令 $a_{ik}$ 为矩阵 A 中的元素,
$b_{kj}$ 为矩阵 B 中的元素,则相乘所得矩阵 C 中的元素 $c_{ij} = \sum_{k=1}^{m} a_{ik} \cdot b_{kj}$
具体可见样例。
输入格式:
第一行两个数 n, m;
接下来 n 行 m 列描述一个矩阵 A;
接下来一行输入 p;
接下来 m 行 p 列描述一个矩阵 B。
输出格式:
输出矩阵 A 与矩阵 B 相乘所得的矩阵 C。
数据范围:
1 ≤ n, m, p ≤ 100 ,
−10000 ≤ $a_{ik}$ , $b_{kj}$ ≤ 10000 。
输入样例:
2 3
1 2 3
3 2 1
2
1 1
2 2
3 3
输出样例:
14 14
10 10
样例解释:
$$
\begin{bmatrix}
14 = 1 × 1 + 2 × 2 + 3 × 3 & 14 = 1 × 1 + 2 × 2 + 3 × 3 \\
10 = 3 × 1 + 2 × 2 + 1 × 3 & 10 = 3 × 1 + 2 × 2 + 1 × 3
\end{bmatrix}
$$
思路图解
Cpp_Code
#include<iostream>
using namespace std;
const int N = 110;
int a[N][N], b[N][N];
int n, m, p;
int main()
{
//读取a矩阵
cin >> n >> m;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
//读取b矩阵
cin >> p;
for(int i = 1; i <= m; i++) {
for(int j = 1; j <= p; j++) {
cin >> b[i][j];
}
}
//计算矩阵 a × b
//按照a矩阵的行数作为最外层循环
for(int i = 1; i <= n; i++) {
//按照b矩阵的列数作为中层循环
for(int j = 1; j <= p; j++) {
//用res更新结果矩阵的每个元素
int res = 0;
//矩阵a的列数与矩阵b的行数一一对应,逐次相乘对应值,作为最内层的循环层
for(int k = 1; k <= m; k++) {
//矩阵a同一行的每列与矩阵b同一列的每行对应的值相乘累加作为结果矩阵的每个元素
//公式:result[i][j] = a[i][k] * b[k][j]
res += a[i][k] * b[k][j];
}
cout << res << " "; //同一行元素用 " " 隔开
}
cout << endl;
}
}