C++入门 PAT乙级B1012 数字分类

C++入门 PAT乙级B1012 数字分类
改了800遍!!!终于改对了题目描述
给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字:

A​1​​ = 能被 5 整除的数字中所有偶数的和;
A​2​​ = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n​1​​−n​2​​+n​3​​−n​4​​⋯;
A​3​​ = 被 5 除后余 2 的数字的个数;
A​4​​ = 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;
A​5​​ = 被 5 除后余 4 的数字中最大数字。

输入格式

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

输出格式

对给定的 N 个正整数,按题目要求计算 A​1​​~A​5​​ 并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。

若其中某一类数字不存在,则在相应位置输出 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;
}

以上代码仅供参考

结果截图

在这里插入图片描述

在这里插入图片描述如需转载,请联系版主!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值