//f(3217)=3*f(999)+f(217)+10^3
//f(999)=10*f(99)+10^2,可以推导出fk9N,10^2表示100到199多出来的百位出现1的次数(100次)
//fk9N(int k)表示从k个9,"999...999"到1出现1的次数为"k*10^(k-1)"此方,fk9N(k)=10*fk9N(k-1)+10^(k-1)
//假设n=a*10^k+b,a为n的最高位,当a=0, f(n)=f(b);当a=1时,f(n)=fk9N(k-1)+f(b)+b+1,其中b+1表示10^k到n之间k位出现1的次数
//到a>1时,f(n)=a*fk9N(k-1)+f(b)+10^(k-1),10^(k-1)表示10^k到10^k+99...999(k个9)之间k位1的数量
//算法的复杂度为O(k),k为n的位数
int findOnefromOneToN(int n){
if(n<0) return -1;
int bits[10];
int nlength=0;
int nvalue=n;
for(int i=0;i<10;i++){
bits[i]=0;
}
while(nvalue){
bits[nlength]=nvalue%10;
nvalue=nvalue/10;
nlength++;
}
int count=0;
if(bits[0]!=0) count++;
nvalue=bits[0];
for(int i=1,int power=10;i<length;i++){
fi9N=i*power/10;
if(bits[i]==1)
count=fi9N+count+nvalue+1;
else if(bits[i]>1)
count=bits[i]*fi9N+count+power;
nvalue=bits[i]*power+nvalue;
power=10*power;
}
return count;
}