PTA 天梯赛 L1-048 矩阵A乘以B

175 阅读2分钟

题目链接

题目详情

给定两个矩阵AABB,要求你计算它们的乘积矩阵ABAB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若AARaR_a行、CaCa列,BBRbR_b行、CbC_b列,则只有CaC_aRbR_b相等时,两个矩阵才能相乘。

输入格式:

输入先后给出两个矩阵AABB。对于每个矩阵,首先在一行中给出其行数RR和列数CC,随后RR行,每行给出CC个整数,以1个空格分隔,且行首尾没有多余的空格。输入保证两个矩阵的RRCC都是正数,并且所有整数的绝对值不超过100

输出格式:

若输入的两个矩阵的规模是匹配的,则按照输入的格式输出乘积矩阵ABAB,否则输出Error: Ca != Rb,其中CaC_aAA的列数,RbR_bBB的行数。

输入样例1:

2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8

输出样例1:

2 4
20 22 24 16
53 58 63 28

输入样例2:

3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72

输出样例2:

Error: 2 != 3

解题思路

这题大家学过线性代数的都能理解,就是矩阵的乘法,矩阵A * 矩阵B的前提是A的列数等于B的行数。且最终的得到的矩阵的型由A的行和B的列决定。即A(2 * 3) * B(3 * 3) -> AB(2 * 3)。
做题时先判断能否相乘,能的话继续。
做法是左边矩阵出行,右边矩阵出列,对应元素相乘,最后全部相加。 对应的代码如下

for (int j = 1; j <= Cb; j++)
    {            
        int sum = 0;
        int k;
        for (k = 1; k <= Rb; k++)
           {
               sum += A[i][k] * B[k][j];
           }
           printf("%d", sum);
           if (j != Cb)
           {
               printf(" ");
           }
           else
           {
               printf("\n");
           }
   }

AC代码

#include<iostream>
using namespace std;

int main()
{
    int Ra = 0, Ca = 0, Rb = 0, Cb = 0;
    int A[1000][1000], B[1000][1000];
    cin >> Ra >> Ca;
    for (int i = 1; i <= Ra; i++)
    {
        for (int j = 1; j <= Ca; j++)
        {
            cin >> A[i][j];
        }
    }
    cin >> Rb >> Cb;
    for (int i = 1; i <= Rb; i++)
    {
        for (int j = 1; j <= Cb; j++)
        {
            cin >> B[i][j];
        }
    }


    if (Ca != Rb)
    {
        cout << "Error: " << Ca << " != " << Rb << endl;
    }
    else
    {
        cout<<Ra<<" "<< Cb << endl;
        for (int i = 1; i <= Ra; i++)
        {
            
            for (int j = 1; j <= Cb; j++)
            {
                
                int sum = 0;
                int k;
                for (k = 1; k <= Rb; k++)
                {
                    sum += A[i][k] * B[k][j];
                }
                printf("%d", sum);
                if (j != Cb)
                {
                    printf(" ");
                }
                else
                {
                    printf("\n");
                }
            }
        }
    }
    return 0;
}