题目

综合:读入矩阵,转置后输出

思路

m,n 与矩阵 a[m][n],建 b[n][m] 双重循环赋值转置;打印 b 行列格式。

解题分析

转置即行列互换:b[j][i]=a[i][j]。若允许原地且矩阵方阵,可在原矩阵上交换 a[i][j] 与 a[j][i];一般 m×n 矩形则另开 b 更清晰。

完整程序

#include <stdio.h>

int main(void)
{
    int m, n, a[10][10], b[10][10];
    if (scanf("%d %d", &m, &n) != 2) {
        return 1;
    }
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &a[i][j]);
        }
    }
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            b[j][i] = a[i][j];
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            printf("%d%c", b[i][j], j + 1 < m ? ' ' : '\n');
        }
    }
    return 0;
}

运行示例

输入:

2 3
1 2 3
4 5 6

输出:

1 4
2 5
3 6

其它写法

下面每种写法都是完整程序,输入输出格式与正文一致,便于对照。

方阵原地转置

仅当 m==n 时适用;矩形矩阵请用正文另开数组写法。

程序:

#include <stdio.h>

int main(void)
{
    int n, a[10][10];
    if (scanf("%d", &n) != 1 || n < 1 || n > 10) {
        return 1;
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &a[i][j]);
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            int t = a[i][j];
            a[i][j] = a[j][i];
            a[j][i] = t;
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%d%c", a[i][j], j + 1 < n ? ' ' : '\n');
        }
    }
    return 0;
}

运行示例

输入:

3
1 2 3
4 5 6
7 8 9

输出:

1 4 7
2 5 8
3 6 9