团体程序设计天梯赛-练习集 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 }

猜你喜欢

转载自www.cnblogs.com/yewanting/p/10539834.html