计算大数的组合

时间:2012-03-09 20:08:49

标签: c# combinations pascals-triangle

我正在尝试计算Pascal三角形的第100行中的特定条目是否可以被3整除。我是使用公式nCr计算的,其中n = 100,r是第100行中的不同条目。 我正在使用以下代码来计算组合

 public static double Combination(int n, int m, double comb)
    {
        for (int r = -1; ++r < m; )
            comb = comb * (n - r) / (r + 1);
        return comb;
    }

但对于像100C16这样的值,我会得到包含十进制和e的大数字。 我在互联网上搜索发现实际上有12个数字不能被3整除,但我的程序给了我63个数字,这些数字在第100行中不能被3整除,这是错误的。可以告诉我这是什么我是做错了。

2 个答案:

答案 0 :(得分:1)

我假设“nCr”是n-choose-r的简写,或者从N中选择r,对吗?

要查看nCr是否可以被3整除,您不需要计算结果,只需要弄清楚它是否可以被3整除。您必须看到n多少次!可被3整除,然后r多少倍!可被3整除(n-r)!是

这真的很简单 - 1!不能被3,2整除!不是,3!可以整除一次。 4!和5!也可以整除一次。 6!是两倍可分,7也是!和8! 9!可以整除4次,依此类推。一直到n(或计算公式而不用递增计算,这不是那么难),并检查。

澄清 - 我的数学学习在希伯来语中,所以“多少次n!可以被3整除”可能不是正确的英语说法。通过“n!可被3 m整除”我的意思是n!=3^m*k,其中k根本不能被3整除。

编辑:一个例子。让我们看看10c4是否可以被3整除。

让我们做一个小桌子,说k多少次!可以被3整除(k!列仅用于演示,在计算divisiblity列时实际上并不需要它):

  k      k!     Divisibility
  1       1     0
  2       2     0
  3       6     1
  4      24     1
  5     120     1
  6     720     2
  7    5040     2
  8   40320     2
  9  362880     4
 10 3628800     4

10c4是10! /(6!* 4!)。

10!可被整除4次(意思是10!= 3 ^ 4 *不能被3整除的东西),   6!是可分2次   4!可以1次整除

所以10! (6!* 4!)可被3整除。实际上是3 * 70。

答案 1 :(得分:1)

首先你使用的是双打,我认为这不是一个好主意。浮点数会在一段时间后出错。

如果数字不会增长,那么巨大的数字可以使用以下方法:

public static long nCr (int m, int n) {
    long tmp = 1;
    int j = 2;
    int k = m-n;
    for(int i = m; i > k; i--) {
        tmp *= i;
        while(j <= n && tmp%j == 0) {
            tmp /= j++;
        }
    }
    while(j <= n) {
        tmp /= j++;
    }
    return tmp;
}

在这种情况下,这仍然是不够的。在这种情况下,可以使用BigInteger

中的System.Numerics结构
public static BigInteger nCr (int m, int n) {
        BigInteger tmp = 1;
        int j = 2;
        int k = m-n;
        for(int i = m; i > k; i--) {
            tmp *= i;
            while(j <= n && tmp%j == 0) {
                tmp /= j++;
            }
        }
        while(j <= n) {
            tmp /= j++;
        }
        return tmp;
    }

你可以说,使用BigInteger不需要交错分割和乘法。但是,如果BigInteger非常大,则对数据的操作将花费一些时间(因为该数字表示为多个字节的数组)。通过保持较小,可以避免较长的计算时间。