给定两个矩阵A和B,计算它们的乘积矩阵AB。
注意:
1、只有规模匹配的矩阵才可以相乘。即若A有Ra
行、Ca
列,B有Rb
行、Cb
列,则只有Ca=Rb
时,A和B才能相乘。
2、乘积矩阵的行数等于A的行数Ra
,列数等于B的列数Cb
。
3、乘积矩阵的第i
行第j
列的元素等于矩阵A的第i
行的元素与矩阵B的第j
列对应元素乘积之和
。 如下所示:
输入格式:
输入先后给出两个矩阵A和B。
对于每个矩阵,首先在一行中给出其行数R
和列数C
,随后R
行,每行给出C
个整数,以1个空格分隔,且行首尾没有多余的空格。
输入保证两个矩阵的R
和C
都是正数,并且所有整数的绝对值不超过100。
输出格式:
若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵AB,否则输出Error: Ca != Rb
,其中Ca
是A的列数,Rb
是B的行数。
输入样例:
2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8
输出样例:
2 4
20 22 24 16
53 58 63 28
输入样例:
3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72
输出样例:
Error: Ca != Rb
#include<stdio.h>
int main()
{
//给出矩阵A
int ra,ca;
scanf("%d %d",&ra,&ca);
int i,j,a[ra][ca];
for(i=1;i<=ra;i++)
{
for(j=1;j<=ca;j++)
{
scanf("%d",&a[i][j]);
}
}
//给出矩阵B
int rb,cb;
scanf("%d %d",&rb,&cb);
int b[rb][cb];
for(i=0;i<rb;i++)
{
for(j=0;j<cb;j++)
{
scanf("%d",&b[i][j]);
}
}
//先判断是否能进行相乘
if(ca!=rb) //如果不能匹配
{
printf("Error: Ca != Rb\n");//题目并未要求给出具体的Ca Rb的值
}
else//如果可以匹配
{
int k,sum;
printf("%d %d\n",ra,cb);//如果可以匹配先输出结果矩阵的行和列
for(i=0;i<ra;i++)//控制行数偏移
{
for(j=0;j<cb;j++)//控制列数偏移
{
sum=0;//每次相加开始时的初始值应该是0,避免影响下一轮结果
for(k=0;k<ca;k++)//控制数据偏移
{
sum=sum+a[i][k]*b[k][j];//循环算乘积和,A矩阵的数字列坐标变化,B矩阵的数据行坐标变化
}
printf("%d",sum);//输出算得的乘积和
if(j!=cb-1) //一共有cb项,但是最后一个的下标是cb-1,因为是从0开始变化的
{
printf(" ");//如果此时尚未算到结果矩阵的最后一个数字,数字后面还有个空格
}
}
printf("\n");//换行
}
}
return 0;
}