PTA:方阵对角线元素求和及计数(C)

21 篇文章 3 订阅

对输入的一个N*N的方阵,求其两条对角线上的元素之和及非零元素的数量。

输入格式:
第一行输入一个不超过20的正整数N

在接下来的N行中,依次输入方阵的每一行的N个元素,方阵元素为绝对值不超过1000的整数,中间以空格间隔。

输出格式:
在一行中以sum = <s>, count = <c>.的格式输出方阵两对角线上的元素之和以及非零元素的数量,其中<s><c>分别表示元素之和非零元素数量,输出时以实际数量替换。

提示:(1)两条对角线的交叉元素不重复计算;(2)严格按规定格式输出,不得随意增删空格、换行等字符。

输入样例1:

4
1 2 3 4
1 2 3 4
0 1 2 3
0 1 2 3

输出样例1:

sum = 16, count = 7.

输入样例2:

5
1 2 3 2 1
1 2 3 2 1
1 2 3 2 1
1 2 3 2 1
1 2 3 2 1

输出样例:

sum = 15, count = 9.

先看测试点情况
在这里插入图片描述
这个反映了有哪些特殊的点要考虑,0和1分别代表了数组长宽是偶和奇,2就是奇数组对角线相交点是0,3和4分别表示数组只有一个元素为负和为0,5是一般情况
本题思路:
本题目的就 求和计数 嘛,在数组中就是一个循环遍历,判断以后执行相应的代码就行了,具体细节在代码里。

代码

#include<stdio.h>
int main (){
    int a,count=0,m=0,sum=0;//count是非零数量,sum是和
    scanf("%d",&a);
    int str[a][a],q=a-1,w=0;
    for(int i=0;i<a;i++){//读取数组
        for(int j=0;j<a;j++){
             scanf("%d",&str[i][j]);
        }
        getchar();
    }
        for(int i=0;i<a;i++){
        for(int j=0;j<a;j++){
            if(i==m&&j==m){//正对角线(左上到右下)
                sum+=str[i][j];
                m++;
                if(str[i][j]!=0)count++;
            }
            if(a==1)break;//数组只有一个,直接跳出,以免下面那个判断多加
            if(i==w&&j==q){//副对角线(右上到左下)
                sum+=str[i][j];
                q--;
                w++;
                if(str[i][j]!=0)count++;
            }
        }
    }
    if(a%2!=0&&a!=1){//这个是判断奇偶的,偶没有交叉数,不存在多加的情况
    //而奇就要判断,但是只有1个也不用判断,之前代码已经执行过计数加求和了。
        sum-=str[a/2][a/2];//交叉值加了两次,现减一次
        if(str[a/2][a/2]!=0)count--;//交叉值如果是零,根本就没多加,只有非零才多加了
    }
    printf("sum = %d, count = %d.",sum,count);
    return 0;
}
  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值