この問題を読み解くと、行列 を行列 と行列 の積によって求める問題であるとわかります。
例えば、店舗 におけるお菓子 の合計売り上げ個数 は、行列の積の公式を用いると、
によって求まります。
for 文を使用して のすべての要素について公式を用いて求め、出力形式に従って出力すればよいです。
以下のように 重 for 文を使用することで を求めることできます。
初めの つの for 文で、 のすべての要素 について処理を行うことができます。
つ目の for 文で、行列の積の公式の を計算し、 を求めることができます。
は最大で なので、 重 for 文でも十分高速です。
xxxxxxxxxx
int main(void){
int N, M, K;
int A[100][100] = {}, B[100][100] = {};
scanf("%d %d %d",&N, &M, &K);
for (int i = 0; i < N; i++){
for (int j = 0; j < M; j++){
scanf("%d", &A[i][j]);
}
}
for (int i = 0; i < M; i++){
for (int j = 0; j < K; j++){
scanf("%d", &B[i][j]);
}
}
for (int i = 0; i < N; i++){
for (int j = 0; j < K; j++){
int C_ele = 0; // C の j 列目の要素を用意
for (int k = 0; k < M; k++){ // 行列の積の公式
C_ele += A[i][k] * B[k][j]; // i 行 j 列の要素を行列の積の計算によって求める
}
printf("%d", C_ele);
if (j != K - 1){
printf(" ");
}else{
printf("\n");
}
}
}
return 0;
}
xxxxxxxxxx
using namespace std;
int main(void){
int N, M, K;
cin >> N >> M >> K;
vector A(N, vector<int>(M));
vector B(M, vector<int>(K));
for (int i = 0; i < N; i++){
for (int j = 0; j < M; j++){
cin >> A[i][j];
}
}
for (int i = 0; i < M; i++){
for (int j = 0; j < K; j++){
cin >> B[i][j];
}
}
for (int i = 0; i < N; i++){
for (int j = 0; j < K; j++){
int C_ele = 0; // C の j 列目の要素を用意
for (int k = 0; k < M; k++){ // 行列の積の公式
C_ele += A[i][k] * B[k][j]; // i 行 j 列の要素を行列の積の計算によって求める
}
cout << C_ele;
if (j != K - 1){
cout << " ";
}else{
cout << endl;
}
}
}
return 0;
}
xxxxxxxxxx
N, M, K = map(int,input().split())
A = [list(map(int,input().split())) for _ in range(N)]
B = [list(map(int,input().split())) for _ in range(M)]
for i in range(N):
C = [] # C の i 行目の配列を用意
for j in range(K):
C_ele = 0 # C の j 列目の要素を用意
for k in range(M): # 行列の積の公式
C_ele += A[i][k] * B[k][j] # i 行 j 列の要素を行列の積の計算によって求める
C.append(C_ele)
print(*C) # C の i 行目を出力