#include <stdio.h>
#define N 4
void Transpose(int a[][N]) { //这里是个易错点
int i,j,t;
for(i = 0; i < N - 1; ++i) { //i从0到3 第一行到第四行
for(j = i + 1; j < N; ++j) { //j从1,2,3,
t = a[i][j];
//不换的:(0,0)(1,1)(2,2)(3,3)对角线元素(1,0)(2,0)(2,1)(3,0),(3,1),(3,2),
//换的 (0,1)(0,2) (0,3),(1,2),(1,3),(2,3),
a[i][j] = a[j][i];
a[j][i] = t;
}
}
}
void Show(int a[][N]) {
int i,j;
for(i = 0; i < N; ++i) {
for(j = 0; j < N; ++j)
printf("%4d",a[i][j]);
printf("\n");//每输入一行,换个行
}
}
int main() {
int a[N][N] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
printf("转置前 :\n");
Show(a);
Transpose(a);
printf("转置后 :\n");
Show(a);
getchar(); //让程序停留在这一步,直到它从键盘接收到消息.
return 0;
}
经验之谈:
1.二维数组的形参,列元素个数需指出。
2.这个矩阵转置在一定程度上提高了时间复杂度。因为只处理了对角线以上的元素,这减小了成本的思维需刻意练习,不教条思维处理全部元素,费时费力。
如果你有更好的观点,在评论区留下你的看法。