PAT 乙級 1012.數字分類 C++/Java

題目來源html

給定一系列正整數,請按要求對數字進行分類,並輸出如下 5 個數字:ios

  • 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​​ 並在一行中順序輸出。數字間以空格分隔,但行末不得有多餘空格。測試

若其中某一類數字不存在,則在相應位置輸出 Nspa

輸入樣例 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的數組中,每次添加一個數code

而後分別對每一個數組中保存的數字進行處理htm

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;
}

小結

求A1-A5的時候要判斷vector長度是否爲0,不然會發生段錯誤(越界)blog

求A5能夠直接從大到小排序,取第一個數字排序

輸出A4的時候用佔位符%.1lf控制輸出格式,精確到小數點後一位ip

循環中判斷條件 if (i == 0 && A1 == 0 || i != 0 && vec[i].size() == 0) 若是沒有 i == 0 && A1 == 0 ,若輸入0,輸出結果就會是0而不是N

相關文章
相關標籤/搜索