1. 程式人生 > 其它 >LuoguB2105 矩陣乘法 題解

LuoguB2105 矩陣乘法 題解

LuoguB2105 矩陣乘法 題解

Content

給定一個 \(n\times m\) 的矩陣 \(A\) 和一個 \(m\times k\) 的矩陣 \(B\),求兩個矩陣相乘得到的矩陣。

\(n\times m\) 的矩陣 \(A\) 和一個 \(m\times k\) 的矩陣 \(B\) 相乘會得到一個 \(n\times k\) 的矩陣 \(C\),並且有以下關係:

\[C_{i,j}=\sum\limits_{p=1}^mA_{i,p}+B_{p,j} \]

資料範圍:\(1\leqslant n,m\leqslant 100\)

Solution

根據題意,我們先迴圈 \(i\),再迴圈 \(j\),最後在迴圈 \(p\)

,按照公式直接求 \(A_{i,p}\)\(B_{p,j}\) 的和,加入 \(C_{i,j}\) 中即可得到 \(C\) 矩陣。

多提一嘴:當且僅當 \(A\) 矩陣的列數等於 \(B\) 矩陣的行數時,\(A\times B\) 才有意義

Code

#include <cstdio>
using namespace std;
int n, m, k, a[107][107], b[107][107], c[107][107];

int main() {
    scanf("%d%d%d", &n, &m, &k)
    for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) scanf("%d", &a[i][j]);
    for(int i = 1; i <= m; ++i) for(int j = 1; j <= k; ++j) scanf("%d", &b[i][j]);
    for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) for(int l = 1; l <= k; ++l) c[i][j] += a[i][l] * b[l][j];
    for(int i = 1; i <= n; ++i) {for(int j = 1; j <= k; ++j) printf("%d", c[i][j]); puts("");}
    return 0;
}