一、 题目
给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字:
A1= 能被 5 整除的数字中所有偶数的和;
A2= 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1−n2+n3−n4⋯;
A3= 被 5 除后余 2 的数字的个数;
A4= 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;
A5= 被 5 除后余 4 的数字中最大数字。
输入格式:
每个输入包含 1 个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N,随后给出 N 个不超过 1000 的待分类的正整数。数字间以空格分隔。
输出格式:
对给定的 N 个正整数,按题目要求计算 A1~A5
并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。
若其中某一类数字不存在,则在相应位置输出 N。
输入样例 1:
13 1 2 3 4 5 6 7 8 9 10 20 16 18
输出样例 1:
30 11 2 9.7 9
输入样例 2:
8 1 2 4 5 6 7 9 16
输出样例 2:
N 11 2 N 9
二、代码
易错点
- 第八个测试点过不去: 单独处理 i=1!!!
之所以过不去是因为如果交错求和等于0,那么岂不是就直接输出"N"了。 所以用k来计数!!!
新的技巧和方法
- 关于输出多余空格的新方法:
if(i!=0) cout<<" "; //一行代码直接搞定!!!!
- switch(n % 5) :
n % 5直接就是结果! 不用再再添加多余的额外函数!!!
比如bool divideFive(int n) 返回处理之后的结果!! - 交错求和
a[1] += pow( -1, count ) x;* //记住pow函数
- 关于 i 如果不同会有不同的结果的问题!!
if条件单独处理i
if( i == 1){}
if(i==2) {}
...... //(普通的情况)
分析
- 整体有5种可能,所以采用switch语句可能较为方便。但是直接switch(n % 5) 就可以!!
- 输出代码,可以采用三元运算符。(看的别人代码,觉得很简洁,在此摘录)
(a[0]>0)?(cout<<a[0]<<" "):(cout<<"N ");
(a[1]!=0)?(cout<<a[1]<<" "):(cout<<"N ");
(a[2]>0)?(cout<<a[2]<<" "):(cout<<"N ");
(a[3]>0)?(cout<<fixed<<setprecision(1)<<a[3]/flag<<" "):(cout<<"N ");
(a[4]>0)?(cout<<a[4]):(cout<<"N");
- 注意最后一个测试点
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
int a[5] = {0};
float j = 0.0;
int n, count;
cin >> count;
int k=0;
while(count--) {
cin >> n;
switch(n % 5) {
case 0:
if( n%2 == 0) {
a[0]+=n;
}
break;
case 1:
if(k % 2 == 0) {
a[1]+=n;
k++;
}else {
a[1]-=n;
k++;
}
break;
case 2:
a[2]++;
break;
case 3:
a[3] += n;
j++;
break;
case 4:
if( n > a[4]) {
a[4] = n;
}
break;
}
}
for(int i=0; i<5; i++) {
if(i!=0) cout<<" ";
if(i == 1) {
if(k != 0) {
printf("%d", a[1]);
continue;
}else {
printf("N");
continue;
}
}
if(a[i] == 0) {
printf("N");
}else if(i == 3){
printf("%0.1f", a[i]/j);
}else {
printf("%d", a[i]);
}
}
return 0;
}