http://acm.hpu.edu.cn/vjudge/contest/view.action?cid=7#problem/B
B - 矩阵乘法
Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%lld & %llu
Submit
Status
Description
给定两个矩阵
A
和
Input
第一行输入一个整数
T
,代表有
每组数据第一行输入两个整数 N,M ,代表矩阵 A 的行、列。
接下来
之后一行输入两个整数 n,m ,代表矩阵 B 的行、列。
接下来
注: 1<=T<=500,1<=N,m<=100,1<=M,n<=10,1<= 矩阵元素 <=20 。
Output
若矩阵
A、B
可以相乘,先输出
YES
,再输出相乘得到的矩阵。
对每行的矩阵元素,每两个元素之间有一个空格,最后一个没有空格。
反之输出 NO 。
Sample Input
2
2 2
1 1
1 1
2 3
1 1 1
1 1 1
2 3
1 1 1
1 1 1
2 2
1 1
1 1
Sample Output
YES
2 2 2
2 2 2
NO
矩阵乘法:只有当矩阵A的列数与矩阵B的行数相等时A*B才有意义。
矩阵乘法满足结合律,但不满足交换律
两矩阵乘积得到的新矩阵行数等于左边矩阵的行数,列数数等于右边矩阵的列数.
矩阵乘法运算不满足交换律,AB称为A左乘B,B右乘A;即:AB!=BA
BA=0不能得出A=0或B=0,但有时也会有例外
结合律:(AB)C=A(BC)
分配律:(A+B)C=AC+BC
#include<stdio.h>
int main()
{
int m,s,n,k,T;
scanf("%d",&T);
while(T--)
{
int a[111][11],b[11][111];
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
scanf("%d%d",&s,&k);
for(int i=0;i<s;i++)
for(int j=0;j<k;j++)
scanf("%d",&b[i][j]);
if(n!=s)
{
printf("NO\n");
}
else
{
printf("YES\n");
int t,r;
for(int i=0;i<m;i++)
{
for(int j=0;j<k;j++)
{
r=0;
t=0;
while(t!=s)
{
r+=a[i][t]*b[t][j];
t++;
}
printf("%d",r);
if(j<k-1) printf(" ");
}
printf("\n");
}
}
}
return 0;
}
本文介绍矩阵乘法的基本规则,包括结合律和不满足交换律的特点,并通过一个具体的编程实例展示了如何判断两个矩阵是否可以相乘及相乘的具体过程。
1532

被折叠的 条评论
为什么被折叠?



