class Solution {
public:
int NumberOf1Between1AndN_Solution(int n) {
if(n<=0) return 0;
string str=to_string(n);
return NumberOf1(str,0);
}
int NumberOf1(string& str,int startIndex){
if(str.empty() ||str[startIndex]<'0'||str[startIndex]>'9'||str[startIndex]=='\0') return 0;
unsigned int length=str.size()-startIndex;
int first=str[startIndex]-'0';
if(length==1 && first==0)
return 0;
if(length==1 && first>0)
return 1;
int numFirstDigit=0;
if(first==1){
string subStr=str.substr(startIndex+1);
numFirstDigit=atoi(subStr.c_str())+1;
}
else if(first>1)
numFirstDigit=PowerOf10(length-1);
int numOtherDifit=first*(length-1)*PowerOf10(length-2);
int numRecursive=NumberOf1(str, startIndex+1);
return numFirstDigit+numOtherDifit+numRecursive;
}
int PowerOf10(unsigned int n){
int result=1;
for(unsigned int i=0; i<n; i++)
result = 10*result;
return result;
}
};