Leetcode 1到n中x的个数

题目描述


给定一个整数n,返回从1到n的数字中1出现的个数。
例如:
n=5, 1∼n为1, 2, 3, 4, 5。那么1出现了1次,所以返回1。
n=11, 1∼n为1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11。那么1出现的次数为1(出现1次),10(出现1次),11(有两个1,所以出现了2次),所以返回4。

思路*

分别研究不同位上的1出现的个数,其规律如下:
以1023为例子:

对于个位数上为1的情况,可以将1=>1023划分为102个大小为10的区间,以及1021=》1023
那么个位数上1的个数为:102+1=103

对于十位数上为1的情况,可以将1=>1023划分为10个大小为100的区间,以及1001=>1023
那么十位数上1的个数:10*10+10=110

对于百位数上为1的情况,可以将1=>1023划分为1个大小为1000的区间,以及1001=>1023
那么百位数上1的个数:1*100=100

对于千位数上为1的情况,注意到最高位为1,那么个数为:23+1=14

因此一般的思路为:

分析原先数字能够划分为多少个k大小的区间,(k=10,100,1000…)那么每个区间内一定包含 k/10 数量的1 同时研究剩余的那个区间最高位和1的大小关系:

大于1时,那么+=k/10
等于1时,那么+= 剩余数字+1
小于1时,那么+=0

代码

int main()
{
    long num;
    cin>>num;
    long p=1;  //每个研究区间内包含的1的数量
    long count=0;
    while(p<=num)
    {
        count+=p*(num/(p*10));
        //可以划分出多少个p*10的大小的区间
        if((num%(p*10)/p)>1)
            count+=p;
        else if((num%(p*10)/p)==1)
        {
             count+=1;
             count+=num%(p); 
        }
        p*=10;
    }
    cout<<count<<endl; 
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页