看到一道别人的面试题:统计出从0-n之间1的个数,如n=13,f(0..13)=>6,0到13有6个数带有1,要求不能用字符串方式计算,只能用数学方式。
看回贴都没个答案,于是自己也来做做,做好了想回贴发现要回答N多问题。。几十题,就懒的点了,在自己空间说下了,哈哈
解法如下:
首先我用字符串加起来的方式计算得出一个规律。。
0 – n 1的个数
9 1
99 20
999 300
于是咯,思路出来了:
0 – 9, 1 #只有1了
0 – 99, 1 + 10 + 1 + (10 – 2) #1加上10 – 19的十位1 再加11上多一个1,然后20 – 99都会有21, 31。。。的
0 – 999, 到这里了嘛,规律不就出来了么, 999就有10个0-99了,那就是20 * 10,再加上100 – 199,那就是300了
0 – 9999, 自然就是300 * 10 + 1000了, 4000
0 – 1234, 300(999中的) + 1 + 234 (1000 – 1234 每次千位都有一个) +
2 * 20(234中两个99) + 100 (100 – 199的) + 3(10 – 30个位上)
+ 10(10 – 19) + 1(个位0 – 4) = 689
从高位一直下来就OK了,还要判断下比如 + 1 + 234这里,这里的每一个数字都会有千位上的1,又如234,100 – 199中百位都会有一就要加上,这里只是分了两种情况,大于1和等于1