题目描述
请写一个程序,对于一个m行m列的(1<m<10)的方阵,求其每一行,每一列及主对角线元素之和,最后按照从大到小的顺序依次输出。
输入描述:
共一组数据,输入的第一行为一个正整数,表示m,接下来的m行,每行m个整数表示方阵元素。
输出描述:
从大到小排列的一行整数,每个整数后跟一个空格,最后换行。
示例1
输入
复制
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 <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
bool cmp(int a, int b){
return a > b;
}
int main(){
int str[10][10];
int m;
while(scanf("%d", &m) != EOF){
int i, j, k = 0;
int sum[100];
//输入方阵元素
for(i = 0; i < m; i++){
for(j = 0; j < m; j++){
scanf("%d", &str[i][j]);
}
}
//每一行元素之和
int row = 0;
for(i = 0; i < m; i++){
row = 0;
for(j = 0; j < m; j++){
row = row + str[i][j];
}
sum[k++] = row;
}
//每一列元素之和
int column = 0;
for(j = 0; j < m; j++){
column = 0;
for(i = 0; i < m; i++){
column = column + str[i][j];
}
sum[k++] = column;
}
//主对角线元素之和
int diagonal1 = 0;
for(i = 0; i < m; i++){
diagonal1 = diagonal1 + str[i][i];
}
sum[k++] = diagonal1;
//副对角线元素之和
int diagonal2 = 0;
for(i = m - 1; i >= 0; i--){
diagonal2 = diagonal2 + str[i][m - 1 - i];
}
sum[k++] = diagonal2;
//排序
sort(sum, sum + k, cmp);
for(i = 0; i < k; i++){
printf("%d ", sum[i]);
}
printf("\n");
}
return 0;
}