寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

Aizu Online Judge in C #ITP1_7_D C言語による行列の積

C言語による行列の積です。
n×m の行列 A と m×l の行列 B から、それらの積である n×l の行列 C を出力するプログラムです。

・問題
 n×m の行列 A と m×l の行列 B を入力し、それらの積である n×l の行列 C を出力するプログラムを作成してください。
 行列 C の各要素 cij は次の式で得られます:
f:id:neguse_atama:20200322203621p:plain
 ここで、A、B、C の各要素をそれぞれ aij、bij、cij とします。

・入力される値
 1行目に n、m、l が空白区切りで与えられます。
 続く行に n×m の行列 A と m×l の行列 B が与えられます。

・期待する出力
 n×l の行列 C の要素 cij を出力してください。
 各行の隣り合う要素を1つの空白で区切ってください。

・条件
   1≤n,m,l≤100
   0≤aij,bij≤10000

僕が作成、提出したコードは、以下のとおりです。

/*
 ITP1_7_D : Matrix Multiplication
 http://judge.u-aizu.ac.jp/
 C言語による行列の積
 https://neguse-atama.hatenablog.com
*/
#include <stdio.h>
int main(void){
    int n,m,l;
    int i,j,k;
    int a[110][110],b[110][110];
    long int c[110][110]={0};
    scanf("%d %d %d",&n,&m,&l);
    for(i=0;i<n;i++){
        for(j=0;j<m;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for(i=0;i<m;i++){
        for(j=0;j<l;j++){
            scanf("%d",&b[i][j]);
        }
    }
    for(i=0;i<n;i++){
        for(j=0;j<l;j++){
            for(k=0;k<m;k++){
                c[i][j]+=a[i][k]*b[k][j];
            }
            if(j!=0){
                printf(" ");
            }
            printf("%ld",c[i][j]);
        }
        putchar('\n');
    }
    return 0;
}

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/
ITP1_7_D : Matrix Multiplication