原题
题目描述
给你两个矩阵A(n*k),B(k*m),请求A*B。
输入
第一行是一个整数K,表示样例的个数。 每个样例包含两个矩阵A和B。 每个矩阵的第一行是两个整数n,m,(1≤n,m≤10)表示矩阵的行和列 以后的n行,每行m个整数,每个整数的绝对值不超过100。输入保证A和B是可乘的。
输出
输出每个样例的结果矩阵,矩阵的整数之间用一个空格隔开,行尾无空格。
样例输入
2
2 2
1 1
1 1
2 1
1
1
2 2
1 1
1 1
2 2
1 1
1 0
样例输出
2
2
2 1
2 1
原题链接
传送门
代码
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=20;
int a[N][N],b[N][N],c[N][N];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,k,l,m;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{
for(int j=0;j<k;j++)
{
scanf("%d",&a[i][j]);
}
}
scanf("%d%d",&l,&m);
for(int i=0;i<l;i++)
{
for(int j=0;j<m;j++)
{
scanf("%d",&b[i][j]);
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
c[i][j]=0;
for(int h=0;h<k;h++)
{
c[i][j]+=a[i][h]*b[h][j];
}
printf("%d",c[i][j]);
if(j!=m-1) printf(" ");
}
printf("\n");
}
}
return 0;
}
总结
1.矩阵乘法是啥对我来说可能是这道题最大的难点,矩阵乘法,简单来说,给定两个矩阵,第一个矩阵的列数和第二个矩阵的行数相等,两个矩阵相乘的结果是,一个新的矩阵,新的矩阵行数和第一个矩阵相等,列数和第二个矩阵相等,比如一个2行3列的矩阵,乘以一个3行2列的矩阵,答案是一个2行2列的矩阵,答案矩阵的第一行第一个元素是,第一个矩阵第一行的所有元素和第二个矩阵第一列的所有元素逐项相乘并求和,答案矩阵第一行第二个元素是,第一个矩阵第一行所有元素和第二个矩阵第二列所有元素逐项相乘并求和
2.题目保证了第一个矩阵的列数等于第二个矩阵的行数
3.行尾没有空格,注意判断每一行最后一个元素的数组下标
4.每一次使用c数组都需要初始化,防止前一次循环对当前循环产生影响
5.(有时候感觉一摸一样的代码难以ac,重新敲一遍可以通过,算是一个魔咒还是因为啥原原因......)