1的个数

1,题目

输入一个十进制的数,输出

    (1)、给定n,求出从1到n的所有整数中1的个数。(暂用用f(n)表示)   

    (2)、求满足n=f(n)的最小整数(1除外)。

假如需要求的N=23106,那么计算过程如下:

万位为11 0000--1 9999    共计10000个

千位为1:   0 1 000--2 1 999    共计3*1000 = 3000,其中3表示万位可以填0,1,2三种情况,1000表示后面三位有000-999共1000种可能,所以总共可有3000种可能

百位为1:这里的可能情况并不是:00 1 00--23 1 99,因为最大只能到23106,所以我们可以把总和分为2部分:

                  00 1 00--221 99:共计23*100种,其中23表示万千位可以取00-22,23种可能,100表示十个位可以取00-99,100中可能。

                  23 1 00--231 06:共计7种,即万千位都固定,只有23一种情况,十个位可以取00-56,共57种可能

                  所以百位为1的数字数目,有2300+7 = 2307种;

十位为1:000 1 0--230 1 9   共计231*10=2310种,其中231表示万千百位可以取000-231,232种可能,而10表示个位可以去0-9十种可能。

因为以23110>23106,所以万千百位=231,且十位=1的数字数目为0

个位为1:0000 1--2310 1    共计2311*1种

                  所以总计数目:10000+3000+2307+2310+2311 = 19928种可能。

所以我们只需要对数字位数上的1进行分解计算即可。

下面以12为例写一个简单代码

代码如下:

可以看到最后的计算结果为:

总结:重要的还是思想,就像大道至简中说的代码只是“愚公移山”,相信以后能和计算机更好的交流。

 

 

posted @ 2015-06-01 23:01  dkjjjj  阅读(247)  评论(0编辑  收藏  举报