zoukankan      html  css  js  c++  java
  • (原创)团体程序设计天梯赛-练习集 L1-048 矩阵A乘以B (15 分)

    给定两个矩阵A和B,要求你计算它们的乘积矩阵AB。需要注意的是,只有规模匹配的矩阵才可以相乘。即若A有Ra​​行、Ca​​列,B有Rb​​行、Cb​​列,则只有Ca​​与Rb​​相等时,两个矩阵才能相乘。

    输入格式:

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

    输出格式:

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

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

    思路:这道题就是模拟一下矩阵相乘就好了,第一个矩阵的列数等于第二个矩阵的行数,然后三个for循环即可,最里面的for循环一定是两个矩阵共同的那个,即第一个的列数和第二个的行数,思考一下会发现实际上就是这个先移动,然后再外面两层for循环移动,理清思路即可;

    代码如下:

     1 #include<iostream>
     2 #include<stdio.h>
     3 using namespace std;
     4 
     5 int ans[1000][1000] = {0};
     6 int row1 , com ,col2;
     7 struct maxtr
     8 {
     9     int row;
    10     int col;
    11     int data[1000][1000];
    12 }juzhen[3];     //写一个结构体记录一下矩阵的信息;有行数,列数和数据(二维);
    13 int main()
    14 {
    15     cin>>juzhen[0].row>>juzhen[0].col;        //输入第一个矩阵的行数和列数;
    16     for(int i = 1 ; i <= juzhen[0].row;i++)
    17     {
    18         for(int j = 1 ;j <= juzhen[0].col;j++)
    19         {
    20             cin>>juzhen[0].data[i][j];     //两个for循环输入第一个矩阵的数据;
    21         }
    22     }
    23     
    24     cin>>juzhen[1].row>>juzhen[1].col;      //输入第二个矩阵的行数和列数;
    25     for(int i = 1 ; i <= juzhen[1].row;i++)
    26     {
    27         for(int j = 1 ;j <= juzhen[1].col;j++)
    28         {
    29             cin>>juzhen[1].data[i][j];   //两个for循环输入第二个矩阵的数据;
    30         }
    31     }
    32     if(juzhen[0].col!=juzhen[1].row)    //先判断一下第一个矩阵的列数是否等于第二个矩阵的行数
    33     {
    34         printf("Error: %d != %d",juzhen[0].col,juzhen[1].row);
    35     }
    36     else
    37     {        //如果第一个矩阵的列数等于第二个矩阵的行数,则记录一下新的矩阵的行数和列数,就是下面的row1和col2;
    38         row1 = juzhen[0].row;
    39         com  = juzhen[0].col;    //这是两个矩阵共有的,即第一个的列数和第二个的行数,将其中一个赋值即可;
    40         col2 = juzhen[1].col;    
    41         for(int i = 1 ; i <= row1 ;i++)
    42         {
    43             
    44             for(int k = 1 ; k <= col2;k++)
    45             {
    46                 for(int j = 1 ; j <= com ;j++)     //这个共有的循环一定要放在最里面,根据矩阵的乘法可知,若实在不理解,可以自己再草稿纸上写一遍矩阵的乘法过程;
    47                 {
    48                     ans[i][k] += juzhen[0].data[i][j]*juzhen[1].data[j][k];    用ans[i][k]记录新的矩阵的数据;
    49                 }
    50             }
    51         }
    52         cout<<row1<<" "<<col2<<endl;
    53         
    54         for(int i = 1 ; i <= row1 ;i++)
    55         {
    56             for(int j = 1 ; j <= col2;j++)
    57             {
    58                 cout<<ans[i][j];     //输出数据;
    59                 if(j!=col2) cout<<" ";    //注意规范;
    60                   
    61             }
    62             if(i!=row1 ) cout<<endl;   //注意规范
    63         }
    64     }
    65     return 0;
    66 }
  • 相关阅读:
    查询OOP课程
    MySchool
    华为机试——字符倒叙输出
    数组的sizeof
    华为机试——统计排序
    华为机试——整理数字字符串
    华为机试——求最小张数换零钱算法
    华为机试——拼写检查程序
    C++中的bitset
    华为机试——数字字符串转二进制
  • 原文地址:https://www.cnblogs.com/yewanting/p/10539834.html
Copyright © 2011-2022 走看看