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
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()
{
truescanf("%d",&n);
trueint k=0;
truefor(int i=1;sum<=n;i++,k=(k+1)%4)
true{
truetrueif(i%7==0 || i%10==7 || (i/10)%10==7) //没有判断百位
truetrue{
truetruetruecnt[k]++;
truetruetruecontinue;
truetrue}
truetruesum++;
true}
truefor(int i=0;i<4;i++)
true{
truetrueprintf("%d\n",cnt[i]);
true}
true
truereturn 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;
}