Problem B
题目描述:
请写一个程序,对于一个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
链接:
http://codeup.cn/problem.php?cid=100000581&pid=4
知识点:
初始化数组方式
memset(array,0,sizeof(array));//将数组所有元素初始化为0
代码:
#include<iostream> #include <cstring> using namespace std; int main(){ int m; cin>>m; int num[m][m]; int csum[m],rsum[m]; int all[2*m+2]; int count=0; memset(csum,0,sizeof(csum)); memset(rsum,0,sizeof(rsum)); for(int i=0;i<m;i++){//初始化方阵 for(int j=0;j<m;j++){ cin>>num[i][j]; } } /* for(int i=0;i<m;i++){ for(int j=0;j<m;j++){ cout<<num[i][j]<<" "; } cout<<endl; } */ for(int i=0;i<m;i++){//求每行元素 for(int j=0;j<m;j++){ csum[i]=csum[i]+num[i][j]; } all[count]=csum[i]; //cout<<"count:"<<count<<endl; //cout<<csum[i]<<" "; count++; //cout<<"i:"<<i<<endl; } for(int j=0;j<m;j++){//求每列元素 for(int i=0;i<m;i++){ rsum[j]=rsum[j]+num[i][j]; } all[count]=rsum[j]; //cout<<"count:"<<count<<endl; count++; } int ldiagonal=0,rdiagonal=0; for(int i=0;i<m;i++){ ldiagonal=ldiagonal+num[i][i];//左对角线 } all[count]=ldiagonal; count++; for(int i=0;i<m;i++){ rdiagonal=rdiagonal+num[m-1-i][i]; } all[count]=rdiagonal; count++; for(int i=0;i<count;i++){ for(int j=0;j<count-1-i;j++){ if(all[j]<all[j+1]){ swap(all[j],all[j+1]); } } } //cout<<ldiagonal<<endl; //cout<<rdiagonal<<endl; //cout<<"count:"<<count<<endl; for(int i=0;i<count;i++){ cout<<all[i]<<" "; } cout<<endl; return 0; }
结果:
分析:
经过各种查找,发现原来是题目要求输入多组数据,而不是只能运行一次,因此需要while循环。
同时优化代码,减少for循环的次数,优化后的代码如下
#include<iostream> #include <cstring> using namespace std; int main(){ int m; while(cin>>m){ int num[m][m]; int csum[m],rsum[m]; int all[2*m+2]; int count=0; int ldiagonal=0,rdiagonal=0; memset(csum,0,sizeof(csum)); memset(rsum,0,sizeof(rsum)); for(int i=0;i<m;i++){//初始化方阵 for(int j=0;j<m;j++){ cin>>num[i][j]; } } for(int i=0;i<m;i++){ for(int j=0;j<m;j++){ csum[i]=csum[i]+num[i][j];//求每行元素 rsum[i]=rsum[i]+num[j][i];//求每列元素 } all[count]=csum[i]; count++; all[count]=rsum[i]; count++; ldiagonal=ldiagonal+num[i][i];//左对角线 rdiagonal=rdiagonal+num[m-1-i][i];//右对角线 } /* for(int j=0;j<m;j++){//求每列元素 for(int i=0;i<m;i++){ rsum[j]=rsum[j]+num[i][j]; } } */ all[count]=ldiagonal; count++; all[count]=rdiagonal; count++; //将结果数组排序 for(int i=0;i<count;i++){ for(int j=0;j<count-1-i;j++){ if(all[j]<all[j+1]){ swap(all[j],all[j+1]); } } } for(int i=0;i<count;i++){ cout<<all[i]<<" "; } cout<<endl; } return 0; }
结果: