求在某个范围内,各位数字之和为n的数的个数有多少个,类似的问题在本吧多次出现过。做法无非是2种,插条法和枚举法(穷举法)。
穷举法的问题在于,运用太多的加法,速度慢,是个水磨功夫;
在n≤9时,插条法无疑是最佳选择;但是,当n>9时,插条法就显得无能为力,因为无法避免某位数字大于9的情况出现,如果n值比较小,还可以采用插条法结合穷举法的形式,但是,当n比较大是,也不适用了。
今天在研究其他问题时,无意中发现了一个当n比较大时,仍然可以用插条法的计算数字和为n的数之个数的方法,不知是否成熟,与大家探讨。
首先说一下插条法计算各位数字和n≤9的数字个数的方法。
例1:0~99999中,各位数字之和为9的数有多少个?
一共5位数字(各位数字均可以是0,下同),也就是说,在9个样,8个空,插4个条(分成5份),其中任何一份都可以是0(也就是说,任何一个空中都可以插2个、3个甚至4个条),这样是无法计算的,必须对其进行改进。
改进方法是,消除0。5位数字,各位数字之和为9,如果将每位数字都+1,就变成了5位数字,各位数字之和为14。14个样,13个空,插4个条,C(13,4)=13×12×11×10/4!=715个数。
如果n≥10,用插条法如何消除某一位或某几位数字不小于10的情况出现呢?
先从简单的情况入手。
例2:0~99999中,各位数字之和为17的数有多少个?
首先,还是应用消除0的插条法,一共5位数字,则17+5=22个样,插4个条,分成5份,每份最少是1,插条法计算共有C(21,4)=21!/(4!×17!)=5985
在这里给出一个自定义——插条五位数:插条五位数是由插条法形成的五位数,不是真正的五位数,其某一位或某几位数字不小于10,如:1231(10),个位数为10;20(14)01,百位数为14;1(12)0(11)0,十位数为11,千位数为12等。
5985是各位数字之和为17的插条五位数的个数,显然过大了,因为里面包含了某一位数字不小于10的情况,如:百位数字为12,又如,千位数字为16等等。那么,如何消除这种情况呢?我的方法是扣除10。
之所以说本例简单,是因为各位数字之和为17,最多只可能有1位数字不小于10。既然最多只能有一位数字不小于10,我们就想将这个10扣除掉。22-10=12样,11个空,插4个条,分成5份,每份最少是1,共有C(11,4)=330。这样,我们找到了330个五位数,其各位数字之和为7,任选其中一个五位数,任选其中某位数字+10,就构成了一个各位数字之和为17,且某一位数字不小于10的五位数;1个各位之和为7的五位数,可以变成5个各位数字之和为17,且某一位数字不小于10的五位数。
因此,0~99999中,各位数字之和为17的数为:
各位数字之和为17的插条五位数个数-5×各位数字之和为7的插条五位数个数,即:
C(21,4)-C(5,1)×C(11,4)=5985-5×330=4335(个)
五位数太多,我们可以用两位数和三位数的穷举法验算一下。
0~99中,各位数字之和为17的数只有2个:89和98,按照我的方法计算应该是:
C(18,1)-C(2,1)×C(8,1)=18-2×8=2(个)
0~999中,各位数字之和为17的数按照穷举法列出63个,这里不一一列出。按照我的方法计算得到了相同的结果:
C(19,2)-C(3,1)×C(9,2)=171-3×36=63(个)
再复杂一些的情况:
例3:0~99999中,各位数字之和为29的数有多少个?
各位数字之和为29,按照插条法计算时,最多可能有两位数字不小于10。
仍然按照前面的思路进行计算:
各位数字之和为29的插条五位数-某位数字不小于10的,各位数字之和为29插条五位数-某两位数字不小于10的,各位数字之和为29插条五位数
这时,那些有两位数字不小于10的插条五位数个数被减去了两次,需要补上;因此,
0~99999中,各位数字之和为29的数有:
各位数字之和为29的插条五位数-5×各位数字之和为19的插条五位数+10×各位数字之和为9的插条五位数,即:
C(33,4)-C(5,1)×C(23,4)+C(5,2)×C(13,4)=40920-5×8855+10×715=3795(个)
按照穷举法,0~9999,各位数字之和为29的个数共有120个(这里仍不一一列举),按照我的方法计算:
C(32,3)-C(4,1)×C(22,3)+C(4,2)×C(12,3)=4960-4×1540+6×220=120。
最后一例,0~99999,各位数字之和为45的数有多少个?
C(49,4)-C(5,1)×C(39,4)+C(5,2)×C(29,4)-C(5,3)×C(19,4)+C(5,4)×C(9,4)
=211876-5×82251+10×23751-10×3876+5×126
=211876-411255+237510-38760+630
=1
哈哈!我在开玩笑!不用算就知道是1,纯属理论验算而已。
请诸位多提意见和建议。
穷举法的问题在于,运用太多的加法,速度慢,是个水磨功夫;
在n≤9时,插条法无疑是最佳选择;但是,当n>9时,插条法就显得无能为力,因为无法避免某位数字大于9的情况出现,如果n值比较小,还可以采用插条法结合穷举法的形式,但是,当n比较大是,也不适用了。
今天在研究其他问题时,无意中发现了一个当n比较大时,仍然可以用插条法的计算数字和为n的数之个数的方法,不知是否成熟,与大家探讨。
首先说一下插条法计算各位数字和n≤9的数字个数的方法。
例1:0~99999中,各位数字之和为9的数有多少个?
一共5位数字(各位数字均可以是0,下同),也就是说,在9个样,8个空,插4个条(分成5份),其中任何一份都可以是0(也就是说,任何一个空中都可以插2个、3个甚至4个条),这样是无法计算的,必须对其进行改进。
改进方法是,消除0。5位数字,各位数字之和为9,如果将每位数字都+1,就变成了5位数字,各位数字之和为14。14个样,13个空,插4个条,C(13,4)=13×12×11×10/4!=715个数。
如果n≥10,用插条法如何消除某一位或某几位数字不小于10的情况出现呢?
先从简单的情况入手。
例2:0~99999中,各位数字之和为17的数有多少个?
首先,还是应用消除0的插条法,一共5位数字,则17+5=22个样,插4个条,分成5份,每份最少是1,插条法计算共有C(21,4)=21!/(4!×17!)=5985
在这里给出一个自定义——插条五位数:插条五位数是由插条法形成的五位数,不是真正的五位数,其某一位或某几位数字不小于10,如:1231(10),个位数为10;20(14)01,百位数为14;1(12)0(11)0,十位数为11,千位数为12等。
5985是各位数字之和为17的插条五位数的个数,显然过大了,因为里面包含了某一位数字不小于10的情况,如:百位数字为12,又如,千位数字为16等等。那么,如何消除这种情况呢?我的方法是扣除10。
之所以说本例简单,是因为各位数字之和为17,最多只可能有1位数字不小于10。既然最多只能有一位数字不小于10,我们就想将这个10扣除掉。22-10=12样,11个空,插4个条,分成5份,每份最少是1,共有C(11,4)=330。这样,我们找到了330个五位数,其各位数字之和为7,任选其中一个五位数,任选其中某位数字+10,就构成了一个各位数字之和为17,且某一位数字不小于10的五位数;1个各位之和为7的五位数,可以变成5个各位数字之和为17,且某一位数字不小于10的五位数。
因此,0~99999中,各位数字之和为17的数为:
各位数字之和为17的插条五位数个数-5×各位数字之和为7的插条五位数个数,即:
C(21,4)-C(5,1)×C(11,4)=5985-5×330=4335(个)
五位数太多,我们可以用两位数和三位数的穷举法验算一下。
0~99中,各位数字之和为17的数只有2个:89和98,按照我的方法计算应该是:
C(18,1)-C(2,1)×C(8,1)=18-2×8=2(个)
0~999中,各位数字之和为17的数按照穷举法列出63个,这里不一一列出。按照我的方法计算得到了相同的结果:
C(19,2)-C(3,1)×C(9,2)=171-3×36=63(个)
再复杂一些的情况:
例3:0~99999中,各位数字之和为29的数有多少个?
各位数字之和为29,按照插条法计算时,最多可能有两位数字不小于10。
仍然按照前面的思路进行计算:
各位数字之和为29的插条五位数-某位数字不小于10的,各位数字之和为29插条五位数-某两位数字不小于10的,各位数字之和为29插条五位数
这时,那些有两位数字不小于10的插条五位数个数被减去了两次,需要补上;因此,
0~99999中,各位数字之和为29的数有:
各位数字之和为29的插条五位数-5×各位数字之和为19的插条五位数+10×各位数字之和为9的插条五位数,即:
C(33,4)-C(5,1)×C(23,4)+C(5,2)×C(13,4)=40920-5×8855+10×715=3795(个)
按照穷举法,0~9999,各位数字之和为29的个数共有120个(这里仍不一一列举),按照我的方法计算:
C(32,3)-C(4,1)×C(22,3)+C(4,2)×C(12,3)=4960-4×1540+6×220=120。
最后一例,0~99999,各位数字之和为45的数有多少个?
C(49,4)-C(5,1)×C(39,4)+C(5,2)×C(29,4)-C(5,3)×C(19,4)+C(5,4)×C(9,4)
=211876-5×82251+10×23751-10×3876+5×126
=211876-411255+237510-38760+630
=1
哈哈!我在开玩笑!不用算就知道是1,纯属理论验算而已。
请诸位多提意见和建议。