转http://blog.chinaunix.net/uid-8615291-id-2456793.html
题目:
实现函数int func(unsigned n),其中n为正整数,返回从1到n(包含1和n)之间出现的1的个数,如func(13)=6,func(9)=1。(注意:
不能将整数转化为字符串,剑指offer中的方法不能用
)
分析:
对于数n,可以把它分成三段,高位段most,当前位cur,低位段least,每一段分别为一个整数。对于一个有digit位的数,假设当前位是左数第i位,则设一个临时变量tmp为10的digit-i次方,即比least多一位的最小整数。如数123456,为6位数,digit=6,设当前为左起第3位,则i=3,most=12,cur=3,least=456,tmp=1000。
如果当前位大于1,则从1到n间出现在当前位出现的1的个数是most*tmp+tmp;如果等于1,则是most*tmp+least+1;如果小于,则为most*tmp。
实现:
|