L1-048 矩阵A乘以B (15 分)(详细解剖)有大坑点

    xiaoxiao2024-12-05  65

    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

    #include<iostream> #include<cstring> using namespace std; int main() { int Ra,Ca,Rb,Cb; cin>>Ra>>Ca; int a[Ra][Ca]; int m , n; for (int i = 0; i<Ra; i++) { for (int j = 0; j<Ca; j++) { cin>>a[i][j]; } } cin>>Rb>>Cb; int b[Rb][Cb]; int c[Ca][Rb];//一定要在这定义数组,如果不知道Rb,Cb的值就定义数组,则不能输入 for (int i = 0; i<Rb; i++) { for (int j = 0; j<Cb; j++) { cin>>b[i][j]; } } if (Ca != Rb||Ca<0||Ra<0||Rb<0||Cb<0) { cout<<"Error: "<<Ca<<" != "<<Rb; } else { cout<<Ra<<" "<<Cb<<endl; for (int i = 0; i<Ra; i++) { for (int j = 0; j<Cb; j++) { int sum = 0; for (int k = 0; k<Ca; k++) { m = a[i][k]; n = b[k][j]; sum += n*m; //以题目中的样例说一下。 //c11= a11*b11 + a12*b21 + a13*b31; //c12= a11*b12 + a12*b22 + a13*b32; //c13= a11*b13 + a12*b23 + a13*b33; //c14= a11*b14 + a12*b24 + a13*b34; //c21= a21*b11 + a22*b12 + a23*b13; //c22= a21*b12 + a22*b22 + a23*b23; //c23= a21*b13 + a22*b23 + a23*b33; //c24= a21*b14 + a22*b24 + a23*b34; //c的行对应a的行,c的列对应b的列 //a的行与b的列相等(这点很重要,看懂了就so easy)。 //比如说c12,a的行始终是1,b的列始终是2。 } if(j!=0) cout<<" "; c[i][j]=sum; // cout<<c[i][j]<<" ";//坑点,大坑点:不能这样这样输入空格 //因为这样输入的话,到最后一列之后来个空格才能换行,判为错误。 cout<<c[i][j]; } cout<<endl; } } return 0; }
    最新回复(0)