PAT B1012 数字分类(C++)

PAT甲级目录 | PAT乙级目录

题目描述

给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字:

  • $A_1 = $ 能被 5 整除的数字中所有偶数的和;
  • $A_2 = $ 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 $n_1 - n_2 + n_3 - n_4 \cdots$ ;
  • $A_3 = $ 被 5 除后余 2 的数字的个数;
  • $A_4 = $ 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;
  • $A_5 = $ 被 5 除后余 4 的数字中最大数字。

输入格式:

每个输入包含 1 个测试用例。每个测试用例先给出一个不超过 1000 的正整数 $N$,随后给出 $N$ 个不超过 1000 的待分类的正整数。数字间以空格分隔。

输出格式:

对给定的 $N$ 个正整数,按题目要求计算 $A_1$ ~ $A_5$ 并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。若其中某一类数字不存在,则在相应位置输出 N

输入样例1:

1
13 1 2 3 4 5 6 7 8 9 10 20 16 18

输出样例1:

1
30 11 2 9.7 9

输入样例2:

1
8 1 2 4 5 6 7 9 16

输出样例2:

1
N 11 2 N 9

易错点:

  • 就,仔细看题

也许陌生的知识点

  • y = (y < x ? x : y);
    • 从两者中取较大值的简便表达式

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;
int main(){
int N, x, A[5] = {0}, cnt[5] = {0}, fac = 1;
cin >> N;
for(int i = 0; i < N; i++){
cin >> x;
if(x % 5 == 0 && x % 2 == 0){
A[0] += x;
cnt[0]++;
}
if(x % 5 != 0){
cnt[x % 5]++; // 计数
if(x % 5 == 1){ //交错相加
A[1] = A[1] + fac * x;
fac = -fac;
}
else if(x % 5 == 2){
A[2]++;
}
else if(x % 5 == 3){
A[3] += x;
}
else if(x % 5 == 4){ //取最大值
A[4] = (A[4] < x ? x : A[4]);
}
}
}
for(int i = 0; i < 5; i++){
if(i != 0) printf(" ");
if(cnt[i] == 0) printf("N"); //数字不存在
else{
if(i == 3) printf("%.1f", 1.0 * A[3] / cnt[3]);
else printf("%d", A[i]);
}
}
return 0;
}