CSP 201912-1 报数 100分

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,不过很快就纠正并且通过了平台的测试。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

球王武磊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值