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;
} 

结果:

原文地址:https://www.cnblogs.com/ak918xp/p/13451247.html