西安电子科技大学上机题(三)

题目: 请写一个程序,对于一个m行m列的(1 < m < 10)的方阵,求其每一行,每一列及主对角线元素之和,最后按照从大到小的顺序依次输出。

输入说明:共一组数据,输入的第一行为一个正整数,表示m,接下来的m行,每行m个整数表示方阵元素。

输入格式:

1
输入一个数字方阵

输出格式:

1
从大到小排列的一行整数,每个整数后跟一个空格,最后换行

输入样例:

1
2
3
4
3
1 2 3
4 5 6
7 8 9

输出样例:

1
24 18 15 15 15 12 6

思路:

  • 最优的算法在于用最少的循环做最多的事
  • 本题简单,直接硬算,注意策略即可

代码:

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
26
27
28
29
30
31
32
33
#include <bits/stdc++.h>
using namespace std;
void getSun(int mat[][10], int m, int *res) {

for(int i = 0; i<m; i++) {
for(int j = 0; j<m; j++) {
res[i] += mat[i][j];
res[i + m] += mat[j][i];
if(i == j)
res[2 * m] += mat[i][j];
}
}
}
bool compare(int a, int b) {
return a > b;
}
int main(void) {
int m;
cin >> m;
int mat[10][10];
int res[2 * m + 1] = {0};
for(int i = 0; i<m; i++) {
for(int j = 0; j<m; j++) {
cin >> mat[i][j];
}
}
getSun(mat, m, res);
sort(res, res + (2 * m + 1), compare);
for(int i = 0; i<2 * m + 1; i++)
cout << res[i] << " ";
cout << endl;
return 0;
}

注意点: C语言中,在函数中定义的数组有作用域限制,无法直接 return 需要先初始化再传入函数中操作,或者在函数中使用 new 开辟空间,再 return 返回。