PTA L1-048 矩阵A乘以B C语言

题目:

输入样例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

1 2 3
4 5 6

矩阵b

1 2
3 4
5 6

乘积矩阵ab:

第一行:第一个元素:1*1+2*3+3*5=22 第二个元素:1*2+2*4+3*6=28

第二行:第一个元素:4*1+5*3+6*5=49 第二个元素:4*2+5*4+6*6=64

22 28
49 64

题目代码如下:

#include <stdio.h>

int main()
{
    int a1,a2,b1,b2;//a1,a2第一个矩阵的行列;b1,b2第二个矩阵的行列
    
    scanf("%d %d",&a1,&a2);
    int num1[a1][a2];//创建第一个矩阵
    
    for(int i = 0;i<a1;i++)//为第一个矩阵赋值
    {
        for(int j = 0;j<a2;j++)
        {
            scanf("%d",&num1[i][j]);
        }
    }
    
    scanf("%d %d",&b1,&b2);//创建第二个矩阵
    int num2[b1][b2];
    
    for(int i = 0;i<b1;i++)//为第二个矩阵赋值
    {
        for(int j = 0;j<b2;j++)
        {
            scanf("%d",&num2[i][j]);
        }
    }
        if(a2!=b1)//判断矩阵是否匹配
            printf("Error: %d != %d",a2,b1);//不匹配则输出
        else//匹配则继续往下
        {
            printf("%d %d\n",a1,b2);//先输出乘积矩阵的行列
            
            for(int i = 0;i<a1;i++)//乘积矩阵每个元素的实现
            {
                for(int j = 0;j<b2;j++)
                {
                    int ret = 0;//暂时储存乘积矩阵的一个元素
                    
                    for(int k = 0;k<b1;k++)
                    {
                        //此层循环结束,则乘积矩阵的一个元素形成
                        ret += (num1[i][k] * num2[k][j]);
                    }
                    printf("%d",ret);//输出这个值
                    if(j<b2-1)//为格式做准备,最后一个值的后面没有空格
                        printf(" ");
                }
                printf("\n");//换行
            }
        }
    return 0;
}

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值