一、 题目
给定一系列正整数,请按要求对数字进行分类,并输出以下 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;}