(原創)團體程序設計天梯賽-練習集 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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM