欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Bailian4041 矩阵运算

程序员文章站 2022-04-02 18:17:32
...

4041:矩阵运算
总时间限制: 1000ms 内存限制: 65536kB
描述
矩阵有以下两种运算方式:矩阵乘法和矩阵转置

矩阵乘法的计算方法定义为:
对于矩阵A[m][q]*B[q][n],
相乘的结果为矩阵C[m][n]且对于矩阵C中每一项都有
C[i][j] = A[i][0]*B[0][j] + A[i][1]*B[1][j] + … + A[i][q]*B[q][j]
注意只有当前一矩阵A的列数等于后一矩阵B的行数时两个矩阵才能相乘。

矩阵的转置定义为:
交换矩阵C[m][q]中所有的行列元素所得到的矩阵C’[q][m]称为矩阵C的转置矩阵,即C’[i][j]=C[j][i] (1 <= i <= q, 1 <= j <= m)。

现在给定矩阵A和B,请你计算矩阵A*矩阵B的乘积结果的转置矩阵,如果矩阵A和矩阵B不能进行乘法运算则直接计算矩阵A的转置矩阵。

输入
两个矩阵A和B
第一行为矩阵的大小,后面跟着输入矩阵,所有元素都是整数,矩阵的行和列大小不超过100
x1,y1
a00 a01 a02
a10 a11 a12
a20 a21 a22
a30 a31 a32

x2,y2
b00 b01 b02 b03 b04
b10 b11 b12 b13 b14
b20 b21 b22 b23 b24
输出
矩阵C’或A’
c00 c01 c02 c03 c04
c10 c11 c12 c13 c14
c20 c21 c22 c23 c24
c30 c31 c32 c33 c34
样例输入
4 3
1 2 3
4 5 6
7 8 9
10 11 12
3 5
7 8 9 10 11
4 5 6 7 8
1 2 3 4 5
样例输出
18 54 90 126
24 69 114 159
30 84 138 192
36 99 162 225
42 114 186 258
提示
输出格式 cout << setw(5) << c[i][j];
头文件要包含 < iomanip >

问题链接Bailian4041 矩阵运算
问题简述:(略)
问题分析
    矩阵计算问题,按照数学定义进行计算即可。
    给出2个题解,分别用C++的格式化输出和C的格式化输出,可以做个比较。C++的格式化输出似乎更难以控制。
程序说明:(略)
参考链接:(略)
题记:(略)

AC的C++语言程序如下:

/* Bailian4041 矩阵运算 */

#include <iostream>
#include <iomanip>

using namespace std;

const int N = 100;
int a[N][N], b[N][N], c[N][N];

void print(int a[][N], int x, int y)
{
    for(int i = 0; i < y; i++) {
        for(int j = 0; j < x; j++)
            cout << setw(5) << a[j][i];
        cout << endl;
    }
}

int main()
{
    int x1, x2, y1, y2;

    cin >> x1 >> y1;
    for(int i = 0; i < x1; i++)
        for(int j = 0; j < y1; j++)
            cin >> a[i][j];
    cin >> x2 >> y2;
    for(int i = 0; i < x2; i++)
        for(int j = 0; j < y2; j++)
            cin >> b[i][j];

    if(y1 == x2) {
        for(int i = 0; i < x1; i++)
            for(int j = 0; j < y2; j++)
                for(int k = 0; k < x2; k++)
                    c[i][j] += a[i][k] * b[k][j];
        print(c, x1, y2);
    } else
        print(a, x1, y1);

    return 0;
}

AC的C++语言程序如下:

/* Bailian4041 矩阵运算 */

#include <iostream>
#include <cstdio>

using namespace std;

const int N = 100;
int a[N][N], b[N][N], c[N][N];

void print(int a[][N], int x, int y)
{
    for(int i = 0; i < y; i++) {
        for(int j = 0; j < x; j++)
            printf("%5d", a[j][i]);
        printf("\n");
    }
}

int main()
{
    int x1, x2, y1, y2;

    cin >> x1 >> y1;
    for(int i = 0; i < x1; i++)
        for(int j = 0; j < y1; j++)
            cin >> a[i][j];
    cin >> x2 >> y2;
    for(int i = 0; i < x2; i++)
        for(int j = 0; j < y2; j++)
            cin >> b[i][j];

    if(y1 == x2) {
        for(int i = 0; i < x1; i++)
            for(int j = 0; j < y2; j++)
                for(int k = 0; k < x2; k++)
                    c[i][j] += a[i][k] * b[k][j];
        print(c, x1, y2);
    } else
        print(a, x1, y1);

    return 0;
}