9月份要参加CSP认证的考试,这周是ACM俱乐部训练的最后一周,暑假后面还有六周多一点的时间,正好趁热打铁好好准备。我打算把我在官网模拟考试完成的往年题目都写博客记录,这次补上之前课设完成的201912的前面两题。
201912-1 报数
[题目描述]
甲乙丙丁决定玩一个报数的游戏来打发时间。游戏规则为四个人从1开始轮流进行报数,但如果需要报出的数是7的倍数或含有数字7则直接跳过。
此外大家约定,在总共报出了n个数后(不计入被跳过的数)游戏结束。现在需要你来帮忙统计,游戏过程中每个人各自跳过了几次。
[输入格式]
从标准输入读入数据。
输入仅一行,包含一个正整数n,表示报出了多少个数后游戏结束。
[输出格式]
输出到标准输出。
输出共四行,每行一个整数,依次表示甲乙丙丁四人在游戏过程中跳过的次数。
[样例1输入]
20
[样例1输出]
2
1
1
0
[样例1解释]
报数过程为:
甲:1,乙:2,丙:3,丁:4甲:5,乙:6,丙:跳过,丁:8甲:9,乙:10,丙:11,丁:12甲:13,乙:跳过,丙:15,丁:16甲:跳过,乙:18,丙:19,丁:20甲:跳过,乙:22,丙:23,丁:24
在丁报出24后,四个人总计报出了20个数,游戏结束。
[样例2输入]
66
[样例2输出]
7
5
11
5
[子任务]
●测试点1、2、3、4和5,保证n≤102;
●测试点6、7、8、9和10,保证n≤666。
[设计思路]
①主要数据结构设计:变量n表示总共报出的数字个数,a、b、c、d分别表示四人各自跳过的数字个数,i表示当前的数字,j表示当前已经报出的数字个数。
②算法设计:变量i、j初始化为1,a、b、c、d初始化为0。输入n后,使用while循环,j<=n时,定义变量flag=0,判断i是否含7或为7的倍数,若符合则flag=1,flag=1时判断此时i除以4的余数,余数为1或2或3或0时,相应地a或b或c或d加1。循环最后i加1,若flag=0则j加1。while循环结束后,依次输出a、b、c、d即可。
100分代码
#include <iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int n,a=0,b=0,c=0,d=0,i=1,j=1;
cin>>n;
while(j<=n)
{
int x=i,flag=0;
if(x%7)
while(x)
{
if(x%10==7)
{
flag=1;
break;
}
x/=10;
}
else
flag=1;
if(flag==1)
{
if(i%4==1)
a++;
else if(i%4==2)
b++;
else if(i%4==3)
c++;
else if(i%4==0)
d++;
}//a、b、c、d分别记录四人各自跳过的数字个数
i++;//i是当前的数字
if(flag==0)
j++;//j是当前已经报出数字的总个数
}
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;
cout<<d<<endl;
return 0;
}
[小结]
201912的第1题我在之前5月的时候就完成了,当时班主任老师推荐我们观看CSP研讨会,看完以后收获很多,我也开始对此引起重视。这两天我回顾了一下题目内容,第一题还是非常简单的,在平时的ACM训练等练习和积累之下,我拿到题目的时候思路很顺畅,十分钟左右便写完代码并提交通过了。
题目内容是四个人报数,报到7的倍数或者含7就跳过,最后统计每个人跳过了多少个数字。这和我们学生会玩过的小游戏差不多,意思很好理解。我第一遍写的时候还犯了个小错误,把x每次除以10判断每一位是否是7的时候,把x%10 == 7误写为x%7==0,不过很快就纠正并且通过了平台的测试。