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

1、最高位:为1----则是后面位(如123,则应取23);不为1------则是最高位的(如223,则取100)

2、其它位:如223,可分为0-23,24-123,124-223。其它位是指24-123,124-223的除最高位的1其余可能有的1,可以发现24-123其实其它位为:25,26···99,0,1,2···23,可计算为:最高位*后一位的权重*除最高位其余位数(2*2*10,可看做每一位为1时,其它位为任意整数的所有可能)

3、再加上0-23.

 1 class Solution {
 2 public:
 3     string intostr(int n)
 4         {
 5         string s;
 6         while(n!=0)
 7             {
 8             s+=n%10+'0';
 9             n=n/10;
10         }
11         string res;
12         for(int i=s.size()-1;i>=0;i--)
13             {
14             res+=s[i];
15         }
16         return res;
17     }
18     int pow(int len)
19         {
20         int sum=1;
21         while(len>0)
22         {
23             sum*=10;
24             len--;
25         }
26         return sum;
27     }
28     int sumall(string s,int len)
29         {
30         if(len==s.size()-1)
31             {
32             if((s[len]-'0')!=0)
33                 return 1;
34             else return 0;
35         }
36         int first=0,second=0,last=s[len]-'0';
37         if(last>1)
38             first=pow(s.size()-len-1);
39         else if(last==1)
40              first=atoi(&s[0]+len+1)+1;
41             second=last*(s.size()-len-1)*pow(s.size()-len-2);
42             return first+second+sumall(s,len+1);
43     }
44     int NumberOf1Between1AndN_Solution(int n)
45     {
46       if(n<=0)
47           return 0;
48         string s;
49         s=intostr(n);
50         int sum=0;
51         sum=sumall(s,0);
52         return sum;
53     }
54 };
原文地址:https://www.cnblogs.com/daocaorenblog/p/5381197.html