在从1到n的正数中1出现的次数

来源:互联网 发布:矩阵如何正交化单位化 编辑:程序博客网 时间:2024/05/16 12:08

//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;
}

 

原创粉丝点击