题解:#3910.报数游戏 审核通过

lyhldy CSP-J2二等 2024-08-14 20:46:19 8

题目大意

小朋友在玩报数游戏,从 1 开始报数,除了报到 3 的倍数或含有 3 的数字 时,每次报数都需要鼓掌一次。 指定一个整数n,假设报数到n时,结束游戏,小朋友们需要鼓掌多少次呢?

算法分析

给定一个有序递增序列,求出其中为 3的倍数十进制表示法上含有3 的数的总数。

知识点分析

  • 求余运算
  • 数位分离
  • 一维数组

代码分析

本题有两个关键点(即上述所言的一、二点),我们可以尝试将其判断方法写入一个函数,之后加一个循环依次枚举1~n之间符合条件的书数 之后统计输出即可,下面我着重讲判断函数。

1.三的倍数的求法

这个太简单了,基础中的基础:

if(n%3==0) return 1;
2.十进制表示法上含有3的求法

本质上是数位分离,只要在分离出三时返回1即可。

    do {
        int r = k % 10;   //取出个位
        if (r == 3)       //判断是否是3
            return 1;     //如果是,说明该数符合条件,返回1
                          //否则,继续循环分离个位
        k /= 10;          //当前位已被分离,除以10后继续分离下一位
    } while (k != 0);     //直到该数分离完毕
    return 0;             //若分离完后仍未符合条件,返回0
//当然,还有一种用字符串的方法,不过这题的规模没必要
3.完整函数
bool pd(int k) {
    if (k % 3 == 0)
        return 1;
    //注意,这里不要加"else return 0;",因为该数不能被三整除不代表不含三
    //两个核心思路的判断方法可以互换顺序,只要注意上面说的就行了
    do {
        int r = k % 10;
        if (r == 3)
            return 1;
        k /= 10;
    } while (k != 0);
    return 0;
}

完整代码

我都写到这了你还不会,可别怪我嘲讽你,况且我也不想你或我被封号。

最后注意输出时要把总数字减去统计出来的数字。

{{ vote && vote.total.up }}