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", &times);
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不易,诸君共勉!

posted @ 2019-12-19 22:09  秦_殇  阅读(180)  评论(0编辑  收藏  举报