对输入的一个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;
}