从1到n整数中1出现的次数

来源:互联网 发布:centos 安装ftp 编辑:程序博客网 时间:2024/04/30 13:56

求解:从1到n整数中1出现的次数。比如n=12时,1、10、11、12共出现了5个1.

这是剑指offer的一道题,但是在网上看到了一个精妙的解法。

解:

个位出现的次数=n/10           + (个位数>1时:+1)     + (个位数==1时:+1)

十位出现的次数=n/100*10    + (位数>1时:+10)   +(位数==1时:+n%10+1)

百位出现的次数=n/1000*100+ (百位数>1时:+100) +(百位数==1时:+n%100+1)

以此类推......


位数等于1时,相当于加上它的所有低位值+1,比如:

112  它的百位等于1,就是112/1000*100+(12+1);

126它的百位就是126/1000*100+(26+1)


举一个完整的例子:对于数1139来说:

个位=1139/10+1

十位=1139/100*10+10

百位=1139/1000*100+(39+1)

千位=1139/10000*1000+(139+1)


#include<iostream>using namespace std;class Solution {public:    int NumberOf1Between1AndN_Solution(int n)    {    int dig = 10;    int N = n, ans = 0;    while(N){    ans += n/dig*(dig/10)+(N%10==1?(n%(dig/10)+1):(N%10>1?dig/10:0));    N /= 10;    dig *= 10;    }    return ans;    }};int main(){Solution s;int n;while(1){cin>>n;cout<<s.NumberOf1Between1AndN_Solution(n)<<endl;}return 0;}


0 0