P1012 数字分类
转跳点:🐏
这道题差点把我写哭,主要还是自己考虑的不够全面,先看一下题,我再说一下坑。
给定一系列正整数,请按要求对数字进行分类,并输出以下 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
这道题本身很简单,switch case 对5取余,然后给个情况特殊处理一下就完事了,但是这里还有一个坑就是A2 如果 以0 为判断输出‘N’的条件的的话,那就会出现一组错误,因为A1算是一个交错级数当可能会出现0的情况。所以最好加个特判标志位。其他的就没什么了。
顺便巩固了一下memset的用法(可惜只能将非字符数组全部初始化为0或者-1,至少我现在只会这样的);
因为题目比较简单,所以直接贴代码了
C:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int main() 6 { 7 int times; 8 int Index = 0, _3times = 0, isRemainde1 = 0; 9 int A[5] = {0}; 10 int temp = {0}; 11 int flag = 0; 12 memset(A, -1, sizeof(A)); 13 scanf("%d", ×); 14 15 while (times--) 16 { 17 scanf("%d", &temp); 18 switch (temp % 5) 19 { 20 case 0: 21 if (temp % 2 == 0) 22 { 23 A[0] += temp; 24 } 25 break; 26 case 1: 27 isRemainde1 = 1; 28 if (0 == flag) 29 { 30 A[1] += temp; 31 } 32 else 33 { 34 35 A[1] -= temp; 36 } 37 flag = !flag; 38 break; 39 case 2: 40 A[2]++; 41 break; 42 case 3: 43 A[3] += temp; 44 _3times++; 45 break; 46 case 4: 47 if (A[4] < temp) 48 { 49 A[4] = temp; 50 } 51 break; 52 } 53 } 54 55 for (int i = 0; i < 4; i++) 56 { 57 if (-1 == A[i]) 58 { 59 if (1 == isRemainde1 && 1 == i) 60 { 61 A[i]++; 62 } 63 continue; 64 } 65 A[i]++; 66 } 67 68 for (int i = 0; i < 5; i++) 69 { 70 3 == i ? (0 == _3times ? printf(" N") : printf(" %.1lf", A[i] * 1.0 / _3times)) : (0 == i ? (-1 == A[i] ? printf("N") : printf("%d", A[i])) : (-1 == A[i] ? printf(" N") : printf(" %d", A[i]))); 71 } 72 return 0; 73 }
C++:
1 #include <iostream> 2 #include <vector> 3 #include <iomanip> 4 5 int main(void) 6 { 7 using std::cout; 8 bool isRemainder1 = false; 9 int TestNumber, sign = 1, isRemainder3 = 0; 10 std::cin >> TestNumber; 11 std::vector<int> Remainder(5, -1); 12 13 while (TestNumber--) 14 { 15 int temp; 16 std::cin >> temp; 17 18 switch (temp % 5) 19 { 20 case 0: 21 if (0 == temp % 2) 22 { 23 Remainder[0] += temp; 24 } 25 break; 26 case 1: 27 isRemainder1 = true; 28 if (1 == sign) 29 { 30 Remainder[1] += temp; 31 } 32 else 33 { 34 Remainder[1] -= temp; 35 } 36 sign = !sign; 37 break; 38 case 2: 39 Remainder[2]++; 40 break; 41 case 3: 42 Remainder[3] += temp; 43 isRemainder3++; 44 // /cout << temp << " " << isRemainder3 << " " << Remainder[3] << std::endl; 45 break; 46 case 4: 47 if (Remainder[4] < temp) 48 { 49 Remainder[4] = temp; 50 } 51 break; 52 } 53 } 54 55 for (int i = 0; i < Remainder.size() - 1; i++) 56 { 57 if (-1 == Remainder[i]) 58 { 59 if (true == isRemainder1 && 1 == i) 60 { 61 Remainder[i]++; 62 } 63 continue; 64 } 65 Remainder[i]++; 66 } 67 68 for (int i = 0; i < Remainder.size(); i++) 69 { 70 if (-1 == Remainder[i]) 71 { 72 cout << "N"; 73 } 74 else 75 { 76 if (3 == i) 77 { 78 cout << std::setiosflags(std::ios::fixed) << std::setprecision(1) << (Remainder[3] * 0.1) / (isRemainder3 * 0.1); 79 } 80 else 81 { 82 cout << Remainder[i]; 83 } 84 } 85 86 if (i != Remainder.size() - 1) 87 { 88 cout << " "; 89 continue; 90 } 91 cout << std::endl; 92 } 93 94 return 0; 95 }
C的输出比较诡异,脑子一抽写的,有兴趣可以看一看
PAT不易,诸君共勉!
大道五十,天衍四九,人遁其一!