我编写的矩阵转置算法仅在特定维度生效,请问代码错误出在哪?
错误根因
你当前使用的原地交换转置逻辑仅适用于行数等于列数的方阵,当处理行列数不等的矩形矩阵时会出现逻辑漏洞:
- 原交换循环的边界条件仅覆盖了部分元素,没有处理原始矩阵中行索引大于列数、列索引大于行数的位置,导致大量元素没有参与转置,输出中出现的0就是未被处理的初始垃圾值
- 非方阵的原地转置本身存在维度不匹配的问题,强行原地交换会导致未读取的原始数据被覆盖,无法得到正确结果
修复方案
推荐额外创建转置矩阵存储结果,避免修改原始数据,适配所有合法尺寸的矩阵:
#include <stdio.h> int main() { int WIDTH, HEIGHT, i, j; int matrix[100][100]; // 新增转置矩阵存储结果 int transposed[100][100]; do { printf("Enter height and width: "); scanf("%d %d", &HEIGHT, &WIDTH); if ((WIDTH > 100 || HEIGHT > 100) || (WIDTH < 1) || (HEIGHT < 1)) printf("Dimensions incorrect!\n"); else break; } while (1); printf("Enter elements: "); for (i = 0; i < HEIGHT; i++) for (j = 0; j < WIDTH; j++) scanf("%d", &matrix[i][j]); // 替换原有原地交换逻辑,直接赋值生成转置矩阵 for (i = 0; i < HEIGHT; i++) { for (j = 0; j < WIDTH; j++) { transposed[j][i] = matrix[i][j]; } } printf("Transposed matrix: \n"); for (i = 0; i < WIDTH; i++) { for (j = 0; j < HEIGHT; j++) printf("%5d", transposed[i][j]); printf("\n"); } return 0; }
验证说明
修复后的代码可正常通过你给出的两个测试用例:
- 输入3 2、元素为1 2 3 4 5 6时,输出和预期的2行3列转置结果完全一致
- 输入5 1、元素为1 2 3 4 5时,输出和预期的1行5列转置结果完全一致
内容的提问来源于stack exchange,提问作者casual
相关产品推荐
相关产品推荐

