数字统计,统计在1到n之间2出现的次数

这篇博客介绍了如何统计从1到n之间数字2出现的次数。作者提出了一种算法,通过从个位到最高位逐位判断,分别计算每个数位上2出现的频次。算法的时间复杂度为O(log n)。代码实现中,通过不断更新数位级别的范围和计数,最终得出结果。
摘要由CSDN通过智能技术生成

数字统计,统计在1到n之间2出现的次数

我的思路是把这个数从右往左进行判断,即从个位往最高位判断
我们假设一个数1234
个位,把它分为1-1230 ,和 1231-1234
个位出现次数为: 123 * 1 + 1
十位,分为1-1200,和 1201-1234
十位出现次数为: 12 * 10 + 10
百位,分为1-1000 和 1001-1234
百位出现的次数为:1 * 100 + 35
千位分为 null 和1-1234
千位出现的次数为:0 * 1000 + 0
res = 389
时间复杂度为logn

#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
int x=1;
int m=n;
int res=0;
while(n){
    x=x*10;
    int l,r;
    l=m/x,r=m%x;//l代表左边部分,r代表右边部分
    res += l*(x/10);//加上右边部分的值
    if(n%10>2){res += x/10;}//大于2时+前数位级/10
    if(n%10==2){res += m%(x/10)+1;}//等于2时+不包含当前位的右边部分+1
    n=n/10;
}
cout<<res<<endl;
}
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值