-
问题描述
请写一个程序,对于一个m行m列(2<m<20)的方阵,求其每一行、每一列及主、辅对角线元素之和,然后按照从大到小的顺序依次输出这些值。
注:主对角线是方阵从左上角到右下角的一条斜线,辅对角线是方阵从右上角到左下角的一条斜线。
输入说明
输入数据的第一行为一个正整数m;
接下来为m行、每行m个整数表示方阵的元素。
输出说明
从大到小排列的一行整数,每个整数后跟一个空格,最后换行。
输入样例
4
15 8 -2 6
31 24 18 71
-3 -9 27 13
17 21 38 69
输出样例
159 145 144 135 81 60 44 32 28 27
#include <stdio.h>
int main() {
int n, a[100][100], sum[100] = {0};
int z,i,j;
scanf("%d", &n);
for (i = 0; i < n; i++)
for (j = 0; j < n ; j++)
scanf("%d", &a[i][j]); //输入数据
for (i = 0; i < n; i++)
{
for (j = 0; j < n ; j++)
{
sum[i]=sum[i]+a[i][j]; //计算每一行各数之和,主义是a[i][j]
}
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n ; j++)
{ //i+n是4,是第五个数
sum[i+n]=sum[i+n]+a[j][i]; //计算每一列各数之和,主义是a[j][i]
}
} //此后i=4再不变
for (j = 0; j < n ; j++) //i变为4,i+n=8,是第九个数
sum[i+n]=sum[i+n]+a[j][j]; //计算主对角线之和,主义是a[j][j]
for (j =0; j<n; j++) //i+n+1=9,最后一个数
{ //行依次加,列依次减
sum[i+n+1]=sum[i+n+1]+a[j][n-j-1]; //计算辅对角线之和,主义是a[j][n-j-1]
}
for (i = 1; i < n*2+2 ; i++) //排序,把数字之和大的排在最前面
{
for (j = 0; j < n*2+2 - i; j++)
{
if (sum[j] < sum[j + 1])
{
z = sum[j],
sum[j] = sum[j + 1];
sum[j + 1] = z;
}
}
}
for (i = 0; i < n*2+2 ; i++)
printf("%d ",sum[i]);
return 0;
}