A*B ProblemII(l 2マトリクス乗算)

2331 ワード


A*B Problem II
時間制限:
1000 ms|メモリ制限:
65535 KB
難易度:
1
説明
ACMのC++の学友は多くの宿題があって、最も頭が痛いのは線形代数で、行列を乗算するたびに、大量の乗算が彼を混乱させるので、彼はあなたにプログラムを書いて計算結果が正しいかどうかを検査してもらいたいと思っています.
入力
複数のテストデータがあり、各行にm,n,k(0行列A:m行n列.
行列B:n行k列.
次に、m*n個の数がマトリクスAを表し、n*k個の数がマトリクスBを表し、各数sに対して0<=s<=1000である.
m,n,kが同時に0のときに終了する.
しゅつりょく
2つのマトリクスの積を計算して出力します.
サンプル入力
2 1 3
1
2
1 2 3
2 2 3
1 2
3 4
1 0 1
0 1 0
0 0 0

サンプル出力
1 2 3
2 4 6
1 2 1
3 4 3


ソース
szhhckのダム
#include #include int main() {  int m,n,k,i,j;  int a[55][55],b[55][55],c[55][55];
 while(scanf("%d%d%d",&m,&n,&k),m,n,k)  {          for(i=1;i<=m;++i)     for(j=1;j<=n;++j)                  scanf("%d",&a[i][j]);
   for(i=1;i<=n;++i)     for(j=1;j<=k;++j)                  scanf("%d",&b[i][j]);
         memset(c,0,sizeof(c));
      for(i=1;i<=m;++i)    {     for(j=1;j<=k;++j)     {     c[i][j]=0;     for(int x=1;x<=n;++x)     c[i][j]=c[i][j]+a[i][x]*b[x][j];     }        }       for(i=1;i<=m;++i)    {     for(j=1;j<=k;++j)                  printf("%d ",c[i][j]);     printf("");    }       }  return 0; }
考え方:最終的な結果は
m行n列
n行k列
得られた結果はm行k列
#include #include int main() {  int m,n,k,i,j;  int a[55][55],b[55][55],c[55][55];
 while(scanf("%d%d%d",&m,&n,&k),m,n,k)  {          for(i=1;i<=m;++i)     for(j=1;j<=n;++j)                  scanf("%d",&a[i][j]);
   for(i=1;i<=n;++i)     for(j=1;j<=k;++j)                  scanf("%d",&b[i][j]);
         memset(c,0,sizeof(c));
/*考え方:最終的な結果はm行n列n行k列で得られた結果はm行k列*/for(i=1;i<=m;++i){for(j=1;j<=k;++j){
//位置ごとに記入
    c[i][j]=0;
//m行n列*n行k列for(int x=1;x<=n;++x)//最初の行列からn列まで、2番目の行列からn行まで//aの行まで、bの列は変わらない
    c[i][j]=c[i][j]+a[i][x]*b[x][j];     }        }       for(i=1;i<=m;++i)    {     for(j=1;j<=k;++j)                  printf("%d ",c[i][j]);     printf("");    }       }  return 0; }