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