(洛谷)题目题号P1980 [NOIP2013 普及组] 计数#题解

Hello 大家好我是小亦,今天又来更新第三篇题解?应该是吧,更了那么多我都不知道更了多少哈哈,好了,不笑了,今天我们来讲一下来自NOIP2013年普及组真题,有时候我真的搞不懂,为什么NOIP的知识还在入门水平啊(指的是洛谷的最低水平,无了个大语qwq),话不多说,继续来讲一下这道题的思路,如果觉得这道题对你有帮助的话那就点个赞赞吧或关注qwq,来吧思路:

首先呢这道题是要用到模拟,字符串难怪会那么简单,我说官方也是的出那么简单,话不多说,下面是我的个人思路步骤
  1. 理解问题:我们需要计算从1到n的每个数字中,数字x出现的次数。这里的x是一个0到9之间的数字。

  2. 逐个检查:对于从1到n的每个数字,我们需要检查它每一位上的数字是否等于x。

  3. 分解数字:我们可以将每个数字分解成各个位数上的数字,然后检查每一位是否等于x。

  4. 计数:如果某一位等于x,我们就增加计数器。

  5. 优化:对于大的n值,逐个检查每个数字的每一位可能效率不高。我们可以通过数学方法来优化这个过程。

  6. 数学方法:我们可以计算每个数位上数字x出现的频率。例如,对于个位,每10个数字x就会出现一次。对于十位,每100个数字x就会出现10次,以此类推。

  7. 实现算法:根据上述思路,我们可以编写一个算法来计算数字x在1到n的范围内出现的次数。

下面呢我使用了数学方法优化后的算法思路qwq:

  1. 初始化计数器:设置一个计数器来记录x出现的次数。

  2. 循环遍历:从1遍历到n。

  3. 当前数字:在每次循环中,取出当前的数字。

  4. 检查每一位:对于当前数字的每一位,检查它是否等于x:

    • 如果是,计算这个数位上x出现的次数。例如,如果x是当前的个位数字,那么在下一个10的倍数之前,x会在每个数字的个位上出现一次。
  5. 累加计数:将每个数位上x出现的次数累加到计数器上。

  6. 处理边界:对于最后一个数字,如果它小于10,我们只需要检查个位。如果它小于100,我们还需要检查十位,以此类推。

  7. 输出结果:最后输出计数器的值,这就是x在1到n的范围内出现的次数。

这种方法可以显著减少计算量,特别是对于大的n值。在实现时,我们可以使用字符串来处理数字的每一位,或者使用数学计算来直接得出每个数位上x出现的次数。

好了说了那么多,代码给上,小亦再次提醒抄代码可耻哟(^U^)ノ~YO

#include <bits/stdc++.h>
using namespace std;
int main(){
    int a = 0,b = 0,j=0;
    scanf("%d %d",&a,&b);
    for(int i=1;i<=a;i++){
        int d=i;
        while(d>0){
            int c=d%10;
            d=d/10;
            if(c==b){
                j++;
            }
        }
    }
    printf("%d",j);
    
    return 0;
}

由于这道题过于简单,所以就不给注释辣(纯想偷懒嘿嘿)下期见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值