描述
给 定两个矩阵 A (n*t) 和 B(t*m) ,请计算出C = A*B
输入
第 一行包含一个整数T,表示有T组测试数据。
以 下每组测试数据格式:
第 一行为3个正整数 N T M 分别表示矩阵A的N*T和矩阵B的T*M,均小于等于100.
接 下来的N行,每行T个整数,描述矩阵A;
接 下来得T行,每行M个整数,描述矩阵B。
每 个数字范围为[-100,100]。
输出
输 出N*M行矩阵C
样例输入
样例输出
10 13
22 29
解题思路:
相信学过线性代数的人都知道矩阵乘法是怎么回事,行和列是如何交叉相乘的都很清楚。这里通过程序来模拟,可以用三个二维数组来模拟,通过循环相乘来进行计算即可。
#include<stdio.h>
#include <stdlib.h>
// b[j][k] * c[k][i] = a[j][i]
void matrix(int **b,int **c, int **a, int nx, int ny, int nk)
{
int i,j,k;
for (j=0;j<ny;j++)for(i=0;i<nx;i++)a[j][i]= 0;
for(j=0;j<ny;j++){
for(i=0;i<nx;i++){
for(k=0;k<nk;k++)a[j][i]+= b[j][k]*c[k][i];
};
};
}
void main()
{
int i,j,k,tmp;
int b_row,b_col;
int c_row,c_col;
int a_row,a_col;
int **b,**c,**a;
int number,te;
int n,t,m;
scanf("%d",&number);
for(te=1;te<=number;te++)
{
scanf("%d %d %d",&n,&t,&m);
// 输入B 阵 行数 列数
b_row=n;
b_col=t;
c_row=t;
c_col=m;
// 输入C阵 列数
a_row = b_row;
a_col = c_col;
a = (int **) malloc(sizeof(int *) * a_row);
for (j=0;j<a_row;j++){
a[j] = (int *) malloc(sizeof(int) * a_col);
}
b = (int **) malloc(sizeof(int *) * b_row);
for (j=0;j<b_row;j++){
b[j] = (int *) malloc(sizeof(int) * b_col);
}
c = (int **) malloc(sizeof(int *) * c_row);
for (j=0;j<c_row;j++){
c[j] = (int *) malloc(sizeof(int) * c_col);
}
// 输入B阵元素
for (j=0;j<b_row;j++)
for (i=0;i<b_col;i++){
scanf("%d",&tmp);
b[j][i] = tmp;
}
// 输入C阵元素
for (j=0;j<c_row;j++)
for (i=0;i<c_col;i++){
scanf("%d",&tmp);
c[j][i] = tmp;
}
matrix( b ,c,a, a_col, a_row, b_col);
for(j=0;j<a_row;j++)
{
for (i=0;i<a_col;i++) printf("%d ",a[j][i]);
printf("\n");
}
}
}