1 条题解

  • 0
    @ 2025-8-24 21:16:31

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar chen_zhe
    Aya 敲可爱的~

    搬运于2025-08-24 21:16:30,当前版本为作者最后更新于2025-08-07 16:01:59,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    欢迎报名洛谷网校,期待和大家一起进步!

    这道题目的目标很明确:在一个从 1 到 nn 的数字范围里,找出小杨的幸运数字 kk 一共出现了多少次。我们需要注意的是,一个数字里如果多次出现 kk,比如数字 2222 里有两个 22,那么每一次都要被计算在内。

    要解决这个问题,最直接、最容易理解的方法就是对从 1 到 nn 的每一个整数进行彻底的“检查”。我们可以设计一个程序,用一个循环从 1 开始,依次遍历到 nn。对于每一个正在被检查的数字,我们需要想办法把它拆分成一个个独立的数位,然后判断这些数位中有没有我们正在寻找的幸运数字 kk

    那么,如何拆分一个数字呢?这里有一个非常经典的数学小技巧。我们可以对这个数字反复进行“取余”和“整除”操作。例如,对于数字 123123,我们用它对 1010 取余(123 % 10),就能得到它的个位数 33。然后,我们再用它整除以 1010123 / 10),数字就变成了 1212。我们继续对 1212 进行同样的操作,取余得到 22,整除后剩下 11。最后对 11 操作,得到 11,整除后变为 00。当数字变为 00 时,我们就成功地把它的每一位都分离出来了。在拆分的过程中,每当我们分离出一个数位,就将它与幸运数字 kk 进行比较。如果它们相等,我们就让一个专门的计数器加一。这一部分的代码是:

    int cur = i;
    while (cur > 0) {
        int d = cur % 10;
        if (d == k)
            ans++;
        cur = cur / 10;
    }
    

    我们将这个拆分过程应用到从 1 到 nn 的每一个数上。当外层循环遍历完从 1 到 nn 的所有数字后,这个计数器里记录的总数,就是我们最终要找的答案。

    • 1

    信息

    ID
    10491
    时间
    1000ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者