給定兩個矩陣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 }