給定兩個矩陣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
題目思路:
一開始,一看題目。嗯!沒有思路。。。
什麼是矩陣乘法呢?(此處可以百度瞭解以下)
簡單地說就是上述公式。百度詞條中這樣定義:
看完之後,我們就或許有了一點思路。
於是如果符合條件,我們就依次計算輸出即可。
但是!!!
這道題最最關鍵的就是各種不同的自定義字母所代表的含義。(比如上圖中的是b [1 ] [1] 其實在數組中是b [0] [0];謹慎呀!!!(找這個bug找的腦殼疼)
當然,也可以動態數組,但是這樣更好理解一一些。
#include<bits/stdc++.h>
using namespace std;
int main(){
int c1,c2,r1,r2;
int i,j;
cin>>r1>>c1;
int m[r1][c1];//定義並得到兩個數組
for(i=0;i<r1;i++)
{
for( j=0;j<c1;j++)
{
cin>>m[i][j];
}
}
cin>>r2>>c2;
int n[r2][c2];
for(i=0;i<r2;i++)
{
for( j=0;j<c2;j++)
{
cin>>n[i][j];
}
}
if(c1==r2)
{//首先排除不相等的情況 (規模是否相等)
cout<<r1<<" "<<c2<<endl;
for(i=0;i<r1;i++){//前兩個for得到n個item;
for(j=0;j<c2;j++)
{//輸出每一行;
int sum=0;
for(int k=0;k<c1;k++){//(見公式);
sum=sum+m[i][k]*n[k][j];
}
cout<<sum;
if(j!=c2-1)
cout<<" ";
}
cout<<endl;
}
}
else cout<<"Error: "<<c2<<" != "<<r2;
return 0;
}