我想编写一个函数来获取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的最大值。有没有更好的方法呢?
答案 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。