(原创)团体程序设计天梯赛-练习集 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
,其中Ca
是A的列数,Rb
是B的行数。
输入样例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 }