题目描述
请写一个程序,对于一个m行m列的(1<m<10)的方阵,求其每一行,每一列及主对角线元素之和,最后按照从大到小的顺序依次输出。
输入
共一组数据,输入的第一行为一个正整数,表示m,接下来的m行,每行m个整数表示方阵元素。
输出
从大到小排列的一行整数,每个整数后跟一个空格,最后换行。
样例输入
4
15 8 -2 6
31 24 18 71
-3 -9 27 13
17 21 38 69
样例输出
请写一个程序,对于一个m行m列的(1<m<10)的方阵,求其每一行,每一列及主对角线元素之和,最后按照从大到小的顺序依次输出。
输入
共一组数据,输入的第一行为一个正整数,表示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<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(int a, int b)
{
return a > b;
}//记住左小右大,正常的从小到大排序是return a<b;,那么从大到小就反过来就行
int main()
{
int m;
int temp;
vector<vector<int> > ss; vector<int> s;//声明二维向量容器和一维向量容器
while (cin >> m)//这题题目有点BUG,应该是测试多组数据,否则过不了
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < m; j++)
{
cin >> temp;
s.push_back(temp);
}
ss.push_back(s);
s.clear();//要记得每次用完容器后要倒干净
}
int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0;
for (int i = 0; i < m; i++)
{
sum1 = 0; sum2 = 0;
for (int j = 0; j < m; j++)
{
sum1 += ss[i][j];//计算每行的和
sum2 += ss[j][i];//计算每列的和
if (i == j)
sum3 += ss[i][j];//计算主对角线的和
if (i + j == m - 1)
sum4 += ss[i][j];//计算副对角线的和,题目的另一个BUG,不想吐槽了我
}
s.push_back(sum1);
s.push_back(sum2);
}
s.push_back(sum3);
s.push_back(sum4);
sort(s.begin(), s.end(), cmp);
for (int i = 0; i < s.size(); i++)
{
if (i != s.size() - 1)
cout << s[i] << " ";
else
cout << s[i] << endl;
}
s.clear();//用完容器一定要倒干净
ss.clear();//由于是多组数据,二维的容器也要倒干净
}
}