|
|

楼主 |
发表于 2013-11-28 15:41
|
显示全部楼层
[趣题分享] 为什么下列连乘积皆为整数?
[这个贴子最后由elimqiu在 2013/11/28 05:59pm 第 1 次编辑]
谢谢 drc2000, Ysu2008 , ataorj
a[1]×a[2]× ·····×a[k] = C(n,k),  k = 1, 2, ...., m
所以虽然 a 未必是整数,这些乘积却都是组合数。
知道这点其实是非常有用的。看以下代码 (python):
def comb(n,m):
   if m > n or m < 0:
       return 0
   result = 1
   k = m + 1
   if 2*m > n:
       k = n -m +1
   for i in range(1,k):
       result = result * (n-i+1) / i
   return result
这段代码定义了一个函数 comb(n,m), 就是计算组合数 C(n,m)
大意是说,
n 个不同元素取大于 n 个不同元素成组的取法数以及取负数个元成组的取法皆为 0;
如果 2m > n, 算 C(n,m)  不如算 C(n, n -m);
C(n,0) = C(n,n) = 1;
剩下的情况得当真算,算法就是
C(n,m) = a[1]×a[2]× ·····×a[m]
python 这种语言有个特点,二整数a, b 的python商还是整数:  [a/b],  例如 3/2 得 1, 24/3 得 8, 10/3 得 3.
要得到准确的商,得说 3/2.0 (得 1.5), 10.0/3 (得 3.33333...x) 等等。
由我们的论证知道, 以上算法不会因为python语言的特点而出错。
当然,组合数的算法有很多,例如可以递归等等,但是在种种方案中,上述算法应该是最节省 CPU 和 储存的,也是在最大限度上避免“大数中间结果”的。 |
|