整数中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 };