I am solving a programming problem which is stuck at calculating nCr
efficiently and at the same time avoiding overflows. I have made the following trivial simplifi
I found an interesting solution here: http://blog.plover.com/math/choose.html
unsigned choose(unsigned n, unsigned k) {
unsigned r = 1;
unsigned d;
if (k > n) return 0;
for (d=1; d <= k; d++) {
r *= n--;
r /= d;
}
return r;
}
This avoids overflows (or at least limits the problem) by performing multiplication and division alternatively.
E.g. for n = 8
, k = 4
:
result = 1;
result *= 8;
result /= 1;
result *= 7;
result /= 2;
result *= 6;
result /= 3;
result *= 5;
result /= 4;
done