CSP认证2019.12智障错误

T1

题目要求4个人轮流报数,遇到报7的倍数或者数字有7的人跳过,直到报出$n(n \leq 666)$个数字为止。统计每个人跳过报数的次数。

错误原因:考场粗心,看到$n \leq 666$就以为不用判断百位,只判断了个位十位和倍数,实际上跳过带7的数字后会超过700。

实际得分:50

出错代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <set>
#include <string>
#include <vector>

int n;

int cnt[10];
int sum = 0;

int main() {
scanf("%d", &n);
int k = 0;
for (int i = 1; sum <= n; i++, k = (k + 1) % 4) {
if (i % 7 == 0 || i % 10 == 7 || (i / 10) % 10 == 7) //没有判断百位
{
cnt[k]++;
continue;
}
sum++;
}
for (int i = 0; i < 4; i++) {
printf("%d\n", cnt[i]);
}

return 0;
}

期望得分:100

改正代码(std):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <set>
#include <list>
#include <vector>
#include <map>

int n;

int cnt[10];
int sum = 0;

int main()
{
scanf("%d", &n);
int k = 0;
for (int i = 1; sum <= n; i++, k = (k + 1) % 4)
{
if (i % 7 == 0 || i % 10 == 7 || (i / 10) % 10 == 7 || (i / 100) % 10 == 7) //要判断百位
{
cnt[k]++;
continue;
}
sum++;
}
for (int i = 0; i < 4; i++)
{
printf("%d\n", cnt[i]);
}

return 0;
}