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

    结果:

  • 相关阅读:
    为什么下水井盖是圆的
    静心尽力
    菜鸟的一年
    [转]Libev教程
    流媒体:V4L2视频获取
    [转]Libev源码分析 -- 整体设计
    c#操作xml增删改查
    dwz简单配置与操作
    jsonp 跨域访问
    操作cookie.判断浏览器系统版本,判断safir浏览器存储数据
  • 原文地址:https://www.cnblogs.com/ak918xp/p/13451247.html
Copyright © 2020-2023  润新知