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

Hello大家好啊我是小亦,今天是我更新的第四篇,我有可能要暂时不更新了QWQ看情况吧,但是还是来讲一下这道题,这道题同样来自NOIP2013年普及组的真题同样非常的简单啊话不多说看思路:

这道题呢是让我们求得也是,模拟和字符串其实和上一道题有点相似吧qwq,已下呢是我的个人思路步骤:

这道题要求我们计算从1到n的所有整数中,数字x出现的次数。这里的关键是理解数字x可以出现在任何一个数位上,包括个位、十位、百位等等。我们可以通过以下步骤来解决这个问题:

  1. 逐个检查每个数字:遍历从1到n的每一个整数。

  2. 分解每一位:对于当前遍历到的数字,我们需要检查它的每一位是否等于x。

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

  4. 考虑所有数位:对于每个数字,我们都需要检查它的个位、十位、百位等所有数位。

  5. 优化:对于大的n值,上述方法可能会非常慢,因为我们需要检查每个数字的每一位。我们可以通过数学方法来优化这个过程,例如,计算每个数位上数字x出现的频率。

  6. 数学方法:我们可以计算在给定的范围内,某个特定的数位上数字x出现的次数。例如,对于个位,每10个数字x就会出现一次。对于十位,每100个数字x就会出现10次,以此类推。

  7. 计算频率:对于每个数位,我们可以计算在1到n的范围内,数字x出现的次数。

  8. 累加结果:将所有数位上x出现的次数累加起来,得到最终的结果。

  9. 处理边界情况:对于数字的边界情况,如n是一位数或x是0,我们需要特别处理。

下面是一个使用数学方法的优化思路:

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

  2. 计算个位上的出现次数:计算从1到n的数字中,x出现在个位上的次数。

  3. 计算十位上的出现次数:计算从1到n的数字中,x出现在十位上的次数。

  4. 计算更高位上的出现次数:对于百位、千位等,我们可以使用类似的计算方法。

  5. 累加:将所有数位上的出现次数累加起来。

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

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

说白了使用数学方法就可以显著提高计算效率,特别是对于大的n值。这种方法的时间复杂度是O(1),因为它不依赖于n的值,好了说完了赶紧给代码吧qwq。

#include <bits/stdc++.h>
using namespace std;
int main(){
    int a,b,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;
}

小亦提醒,抄题解可耻,但是注释没写对不起哈,轻点喷行吗qwq

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值