如何在不超过的情况下获得组合编号

时间:2013-12-14 07:16:06

标签: c combinations

我想编写一个函数来获取combination_n_k。这就是我所做的:

int com(int n, int k)
{
    int result = 1;

    for( int i=n; i>(n-k); i--)
        result *= i;

    for( int i=k; i>1; i--)
        result /= i;

    return result;
}

这适用于较小的数字,但当它变为大数字时,结果只会超过int的最大值。有没有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

使用unsigned long long和更聪明的算法可以达到略微更高的界限:

unsigned long long n = /* n */, k = /* k */;

unsigned long long p = 1; /* accumulates the product */
unsigned long long m = k < n - k ? k : n - k; /* min(k, n - k) */
k = m;

unsigned long long i = n - k + 1;
unsigned long long j = 1;

while (m-- > 0) {
    p = p * i++ / j++;
}

如果仍然不够,则必须使用bigint library