C++入门 PAT乙级B1012 数字分类
题目描述
给定一系列正整数,请按要求对数字进行分类,并输出以下 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。
输入样例
13 1 2 3 4 5 6 7 8 9 10 20 16 18
输出样例
30 11 2 9.7 9
思路分析
(1)这道题目需要细心的去做,因为很容易就出错。
比如,A2的结果是否要输出‘N’,不能直接用A2是否等于0或者其他来判断,而是需要判断满足A2条件的数的数目。
(2)输出要注意最后一个数后面不能有空格。
(3)注意题目要求,A4要求输出结果精确到小数点后1位,那么需要注意设置变量时就设为float类型,并且输出时使用cout<<setiosflags(ios::fixed)<<setprecision(1)<<a[3]<<’ '来控制输出的精度。
代码
#include<iostream>
#include <stdio.h>
#include<iomanip>
#include <stdlib.h>
using namespace std;
int main()
{
int num_in[1000];
int i=0;
int N; //输入的测试用例的总数
float a[5]; //按题目要求记录五类数的情况
a[0]=0;
a[1]=0;
a[2]=0;
a[3]=0;
a[4]=0;
int cnt=1; //交错求和时计数
int cnt2=0;
char c;
cin>>N;
if(N<=0||N>1000) //错误输入判断和处理
{
return 0;
}
while(i<N) //输入数字
{
c=getchar(); //获取输入字符
if(c>='0'&&c<='9') //输入正整数
{
ungetc(c,stdin);
cin>> num_in[i++];
}
}
for(int j=0;j<N;j++) //计算A1到A5的值
{
if(num_in[j]>1000||num_in[j]<=0)
{
return 0;
}
if(num_in[j]%2==0&&num_in[j]%5==0) {a[0]=a[0]+num_in[j];} //计算偶数的数量
if(num_in[j]%5==1) //交错求和
{
if(cnt%2!=0)
{a[1]=a[1]+num_in[j];}
else a[1]=a[1]-num_in[j];
cnt++;
}
if(num_in[j]%5==2) a[2]++;
if(num_in[j]%5==3)
{
a[3]=a[3]+num_in[j];
cnt2++; //记录数目
}
if(num_in[j]%5==4)
{
if(num_in[j]>a[4])
{
a[4]=num_in[j];
}
}
}
if(cnt2==0) a[3]=0; //没有符合要求的数,则平均数等于0
else
{
a[3]=a[3]/cnt2; //计算平均数
}
if(a[0]==0)
{
cout<<'N'<<' ';
}
else{
cout<<a[0]<<' ';
}
if(cnt==1)
{
cout<<'N'<<' ';
}
else{
cout<<a[1]<<' ';
}
if(a[2]==0)
{
cout<<'N'<<' ';
}
else{
cout<<a[2]<<' ';
}
if(a[3]==0)
{
cout<<'N'<<' ';
}
else{
cout<<setiosflags(ios::fixed)<<setprecision(1)<<a[3]<<' ';
}
if(a[4]==0)
{
cout<<'N';
}
else
{
cout<<setiosflags(ios::fixed)<<setprecision(0)<<a[4];
}
return 0;
}
以上代码仅供参考
结果截图
如需转载,请联系版主!