标签:scanf 术语 int 专业 二维数组 print 求和 相等 养成
题目:求一个3×3的整数矩阵对角线元素总和。
首先要考虑的是二维数组的对角线特征,从二维矩阵不难看出,一般二维矩阵会有两条对角线,一条从左上往右下,这里我称之为正对角线;另一条从左下往右上,这里我称之为反对角线(可能专业术语不是这样叫,下文的各种名词也不保证其专业性)。然后这里假定要求的二维矩阵都是正矩阵,即行列数量都是相等的矩阵。观察矩阵,可以看出,正对角线的元素行列位置都是相等的,即i==j;反对角线行列位置相加和为N-1。对于奇数矩阵,正反对角线在中心位置有一个元素重合,求和时要减去该元素,偶数矩阵则不需要。下面是代码:
1 #include<stdio.h> 2 #define N 3 3 int main() 4 { 5 int i, j, sum1 = 0, sum2 = 0,sum = 0; 6 int num[N][N] = { {1,2,3},{4,5,6},{7,8,9} }; //初始化二维数组 7 /*求正对角线的和*/ 8 for(i = 0; i<N; i++) 9 for (j = 0; j < N; j++) 10 { 11 if (i == j) //正对角线的数二维下标相等 12 sum1 += num[i][j]; 13 } 14 /*求反对角线的和*/ 15 for(i = 0; i<N; i++) 16 for (j = 0; j < N; j++) 17 { 18 if (j == N - i - 1) //反对角线的数二维下标和为N-1 19 sum2 += num[i][j]; 20 } 21 if (N % 2 == 1) 22 sum = sum1 + sum2 - num[N / 2][N / 2]; //如果行列个数为奇数,则总和多加了一个最中间的数,需要减去 23 else //如果行列个数为偶数,则总对角线的和是正反对角线的和相加 24 sum = sum1 + sum2; 25 printf("二维数组:"); 26 /*输出二维数组*/ 27 for (i = 0; i < N; i++) 28 { 29 printf("\n"); 30 for (j = 0; j < N; j++) 31 printf("%d\t", num[i][j]); 32 } 33 printf("\n"); 34 /*输出对角线总和*/ 35 printf("的对角线和为:%d\n", sum); 36 return 0; 37 }
代码宏定义#define N 3是为了修改时方便把3×3矩阵拓展到其他矩阵来,虽然题目没作要求,但需要养成一个这样的良好习惯。
下面来学习一下配套学习指导的做法:
1 #include<stdio.h> 2 int main() 3 { 4 int a[3][3], sum = 0; 5 int i, j; 6 printf("enter data:\n"); 7 for(i = 0; i<3; i++) 8 for(j = 0; j<3; j++) 9 scanf("%3d",&a[i][j]; 10 for(i = 0; i<3; i++) 11 sum = sum + a[i][i]; 12 printf("sum = %6d\n",sum); 13 return 0; 14 }
看完答案发现还是我想太多了。不过sum+=a[i][i]一重循环就行了,我怎么还要搞个二重循环出来,难受。
标签:scanf 术语 int 专业 二维数组 print 求和 相等 养成
原文地址:https://www.cnblogs.com/teamcolt/p/12919910.html