PAT 乙级 1012
题目
1012 数字分类 (20 分)
给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字:
- A 1 A_1 A1 =能被 5 整除的数字中所有偶数的和;
- A 2 A_2 A2 = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n 1 − n 2 + n 3 − n 4 ⋯ n_1-n_2+n_3-n_4 \cdots n1−n2+n3−n4⋯
- A 3 A_3 A3 = 被 5 除后余 2 的数字的个数;
- A 4 A_4 A4 = 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;
- A 5 A_5 A5 = 被 5 除后余 4 的数字中最大数字。
输入格式
每个输入包含 1 个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N N N,随后给出 N N N 个不超过 1000 的待分类的正整数。数字间以空格分隔。
输出格式
对给定的 N 个正整数,按题目要求计算
A
1
∽
A
5
A _1\backsim A _5
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
我的代码
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
int num;
int A[5]={0};
int B[5]={0};
cin>>num;
while(num--){
int a;
cin>>a;
switch(a%5){
case 0:
if(a%2==0){
B[0]++;
A[0]+=a;
}
break;
case 1:
if(B[1]%2==0){
A[1]+=a;
}
else{
A[1]-=a;
}
B[1]++;
break;
case 2:
A[2]++;
B[2]++;
break;
case 3:
A[3]+=a;
B[3]++;
break;
case 4:
if(a>A[4]){
A[4]=a;
B[4]++;
}
}
}
if(B[0]!=0){
cout<<A[0];
}
else{
cout<<'N';
}
for(int i=1;i<5;i++){
if(B[i]!=0){
if(i==3){
cout<<' '<<setiosflags(ios::fixed)<<setprecision(1)<<double(A[i])/B[i];
continue;
}
cout<<' '<<A[i];
}
else{
cout<<' '<<'N';
}
}
return 0;
}
小提示1
我在写这道题的时候遇到了一个bug ,就是一直不能以浮点数输出 A 3 A_3 A3
if(B[3]!=0){
A[3]=double(A[3])/B[3];
}
不知道大家发现了吗;
.
.
.
.
.
错误写法,A[3]仍然是整型,右侧的9.7赋给A[3]依然是9,即强制类型转换并不会改变原值,希望大家引以为戒.
小提示2
小数点的保留要用到头文件<iomanip>
并在输出时添加setiosflags(ios::fixed)<<setprecision(X)
其中的X
是要保留的位数.