方阵转置 163 PEX7-9 与求和P166 EXE7-7
输入一个正整数n(1<=n<=6),根据下式生成n阶方阵,将该方阵转置(行列互换)后输出。
a[i][j] = i*n+j+1
#include <stdio.h> int main() { int n; printf("输入方阵维数: \n"); scanf("%d", &n); int a[n][n]; for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { a[i][j] = i*n+j+1; } } //以上是二维数组初始化 printf("initiation:\n"); for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { printf("%3d", a[i][j]); } printf("\n"); } //以上是输出初始化的结果 int temp; for (int i=0; i<n; i++) { for (int j=0; j<i; j++) { temp = a[i][j]; a[i][j] = a[j][i]; a[j][i] = temp; } } //以上是转置的思路与代码 printf("\nafter transposition:\n"); for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { printf("%3d", a[i][j]); } printf("\n"); } //以上是转置后的矩阵转出 return 0; }
运行结果:
输入方阵维数: 5 initiation: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 after transposition: 1 6 11 16 21 2 7 12 17 22 3 8 13 18 23 4 9 14 19 24 5 10 15 20 25
在本题的基础上,如果需要求该矩阵除副对角线,最后一列和最后一行以外的所有元素之和:
代码可以这样写:
#include <stdio.h> int main() { int n; printf("输入方阵维数: \n"); scanf("%d", &n); int a[n][n]; for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { a[i][j] = i*n+j+1; } } //以上是二维数组初始化 printf("initiation:\n"); for (int i=0; i<n; i++) { for (int j=0; j<n; j++) { printf("%3d", a[i][j]); } printf("\n"); } //以上是输出初始化的结果 int sum = 0; for (int i=0; i<n-1; i++) { //让i<n-1,而非i<n,可以直接不循环最后一行; for (int j=0; j<n-1; j++) { //同理,让j<n-1,而非j<n,可以直接不循环最后一列; if (i+j != (n-1)) { //副对角线元素特点是i+j=n-1,这里的条件刚好排除副对角元素 sum += a[i][j]; } } } printf("sum = %d\n", sum);