• [山东科技大学OJ]1053 Problem C: Matrix Problem (III) : Array Practice


     

    Time Limit: 1 Sec  Memory Limit: 4 MB
    Submit: 15377  Solved: 5144
    [Submit][Status]

    Description

    求两个矩阵A、B的乘积C=AB。根据矩阵乘法的定义,只有A的列数和B的行数相同才能相乘。可以确保所有运算结果都在int类型的范围之内。

    Input

    输入数据为多个矩阵(最少2个),每个矩阵以两个正整数m和n开始,满足0

    Output

    对输入的矩阵两两相乘:第1个和第2个相乘、第1个和第2个相乘的结果和第3个相乘……按顺序输出矩阵相乘的结果:每行两个元素之间用一个空格分开,每行最后一个元素之后为一个换行,在下一行开始输出矩阵的下一行。

    若前k个矩阵相乘的结果和第k+1个矩阵无法相乘(即不满足矩阵乘法定义),则输出“Not satisfied the definition of matrix multiplication!”。然后用第k+1个矩阵去和第k+2个矩阵相乘。最后一个矩阵只做乘数。

    每两组输出之间用一个空行分隔开。

    Sample Input

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

    Sample Output

    12 15 18 12 15 18 0 0

    HINT

     

    矩阵的乘法就是一行乘以一列加起来做一个元素。

     

    Append Code

    [Submit][Status]


    #include

    #include

    #include

    #include <stdlib.h>

    #include

    int main()

    {

        int i,j,m,n,k=0,bm,bn,l;

        int a[105][105]={0},b[105][105]={0},c[105][105]={0};

        while(1)

        {

            scanf("%d%d",&m,&n);

            if(m==0&&n==0)

                break;

            else

            {

                k++;

                if(k==1)//输入的第一个矩阵储存到b中

                {

                    bm=m;

                    bn=n;//记录b的行列数

                    for(i=1;i<=m;i++)

                        for(j=1;j<=n;j++)

                            scanf("%d",&b[i][j]);

                }

                else//将第二个往后的矩阵储存到a中

                {

                    for(i=1;i<=m;i++)

                        for(j=1;j<=n;j++)

                            scanf("%d",&a[i][j]);//其行列数就是m*n

                }

                if(k==1)

                    continue;//至少输入两个矩阵才有输出

                else

                {

                    if(bn==m&&m!=0&&n!=0&&bm!=0)//符合矩阵相乘的要求

                    {

                        for(i=1;i<=bm;i++)

                        {

                            for(j=1;j<=n;j++)

                            {

                                c[i][j]=0;

                                for(l=1;l<=m;l++)

                                    c[i][j]+=b[i][l]*a[l][j];//将其结果储存到c中;

                            }

                        }

                        for(i=1;i<=bm;i++)

                            for(j=1;j<=n;j++)

                                b[i][j]=c[i][j];//将c复制到b中

                        bm=bm;

                        bn=n;//记录b的行列数

                    }

                    else//如果不符合

                    {

                        printf("Not satisfied the definition of matrix multiplication!\n\n");

                        for(i=1;i<=m;i++)//将a储存到b中

                            for(j=1;j<=n;j++)

                                b[i][j]=a[i][j];

                        bm=m;

                        bn=n;

                        continue;//不再输出其他

                    }

                }

                for(i=1;i<=bm;i++)//输出b

                {

                    printf("%d",b[i][1]);

                    for(j=2;j<=bn;j++)

                    {

                        printf(" %d",b[i][j]);

                    }

                    printf("\n");

                }

                printf("\n");

            }

        }

        return 0;

    }

  • 相关阅读:
    CMT2380F32模块开发14-I2C例程
    反向传播神经网络基本原理,神经网络前向传播
    【微服务部署】08-监控与告警
    药事管理学名词解释和问答题题集
    海外众筹——前期准备与分析
    查看linux中的python版本(三种方法)
    双向带头循环链表之重拳出击
    一种软件升级程序updata的 构造思路
    神经网络怎么看训练效果,神经网络结果图如何看
    新华社《中国扫描十年发展图鉴》:扫描全能王为3亿用户带去“掌心里的便利”
  • 原文地址:https://blog.csdn.net/m0_73840805/article/details/128073322