PAT 乙级 1012.数字分类 C++/Java

题目来源

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

分析:

对输入的每个数字num进行mod 5,将得到的值存放在下标为 num % 5的数组中,每次添加一个数

然后分别对每个数组中保存的数字进行处理

C++实现:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

bool myCmp(int a, int b)
{
    return a > b;
}

//数字分类
int main()
{
    // a mod 5最大值为4
    int A1 = 0;    //被 5 整除的数字中,偶数的和
    int A2 = 0;    //将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算n1 - n2 + n3 - n4...
    int A3 = 0;    //被 5 除后余 2 的数字的个数
    double A4 = 0; //被 5 除后余 3 的数字的平均数,精确到小数点后 1 位
    int A5 = 0;    //被 5 除后余 4 的数字中最大数字 - 排序即可

    int N;
    cin >> N;

    vector<vector<int> > vec(5, vector<int>(0));
    int temp;
    for (int i = 0; i < N; ++i)
    {
        cin >> temp;
        vec[temp % 5].push_back(temp);
    }

    //求A1;
    int len = vec[0].size();
    for (int i = 0; i < len; ++i)
    {
        if (vec[0][i] % 2 == 0)
        {
            A1 += vec[0][i];
        }
    }

    //求A2
    len = vec[1].size();
    if (len != 0)
    {
        for (int i = 0; i < len; ++i)
        {
            if (i % 2 == 1)
            {
                //数组中的第偶数项,取负数 a[1], a[3], a[5]
                // n1 - n2 + n3 - n4
                // 相当于a[0] - a[1] + a[2] - a[3];
                vec[1][i] *= -1;
            }
            A2 += vec[1][i];
        }
    }


    //求A3
    A3 = vec[2].size();
    
    
    //求A4
    if (vec[3].size() != 0)
    {
        for (int i = 0; i < vec[3].size(); ++i)
        {
            A4 += vec[3][i];
        }
        A4 /= vec[3].size();
    }
    

    //求A5
    if (vec[4].size() != 0)
    {
        sort(vec[4].begin(), vec[4].end(), myCmp);
        A5 = vec[4][0];
    }
    

    for (int i = 0; i < 5; ++i)
    {
        if (i != 0)
        {
            cout << " ";    //控制空格输出
        }
        if (i == 0 && A1 == 0 || i != 0 && vec[i].size() == 0)
        {
            cout << "N";
            continue;
        }
        if (i == 0)
        {
            cout << A1;
        }
        else if (i == 1)
        {
            cout << A2;
        }
        else if (i == 2)
        {
            cout << A3;
        }
        else if (i == 3)
        {
            printf("%.1f", A4);
        }
        else if (i == 4)
        {
            cout << A5;
        }
    }
    return 0;
}

 

 

Java实现:

 1 import java.util.Scanner;
 2 
 3 public class Main {
 4     public static void main(String[] args) {
 5         Scanner in = new Scanner(System.in);
 6         int n = in.nextInt();
 7         int[] a = new int[5];
 8         int k = 1, temp = 0;
 9         boolean flag = false;
10         for (int i = 0; i < n; i++) {
11             int data = in.nextInt();
12             if ((data % 5 == 0) && (data % 2 == 0)) {
13                 a[0] += data;
14             }
15             if (data % 5 == 1) {
16                 flag = true;
17                 a[1] += data * k;
18                 k = -k;
19             }
20             if (data % 5 == 2) {
21                 a[2]++;
22             }
23             if (data % 5 == 3) {
24                 a[3] += data;
25                 temp++;
26             }
27             if ((data % 5 == 4) && (data > a[4])) {
28                 a[4] = data;
29             }
30         }
31 
32         for (int i = 0; i < 5; i++) {
33             if (i != 0) {
34                 System.out.print(" ");
35             }
36             if (i == 1) {
37                 if (!flag) {
38                     System.out.print("N"); 
39                 }
40                 else{
41                     System.out.print(a[i]);
42                 }
43             }
44             else if (i == 3) {
45                 if (temp == 0) {
46                     System.out.print("N");
47                 }
48                 else {
49                     System.out.printf("%.1f", (a[3] * 1.0 / temp));
50                 }
51             } 
52             else {
53                 if (a[i] == 0) {
54                     System.out.print("N");
55                 }
56                 else {
57                     System.out.print(a[i]);
58                 }
59             }
60         }
61     }
62 }

 

 

小结

求A1-A5的时候要判断vector长度是否为0,否则会发生段错误(越界)

求A5可以直接从大到小排序,取第一个数字

输出A4的时候用占位符%.1lf控制输出格式,精确到小数点后一位

循环中判断条件 if (i == 0 && A1 == 0 || i != 0 && vec[i].size() == 0) 如果没有 i == 0 && A1 == 0 ,若输入0,输出结果就会是0而不是N

 
posted @ 2019-10-06 09:25  47的菠萝~  阅读(159)  评论(0编辑  收藏  举报