Problem
Design an efficient algorithm for computing c(n, k) that has the property that it never overflows if c(n, k) can be represented as an integer assume n and k are both integers.
Solution
using System;
namespace BinomialCoefficients
{
class Program
{
static int NChooseK(int n, int k)
{
if (n == k || k == 0)
{
return 1;
}
return NChooseK(n - 1, k) + NChooseK(n - 1, k - 1);
}
static void Main(string[] args)
{
for (int n = 1; n < 20; n++)
{
Console.WriteLine("-----------------------------------------------");
for (int k = 0; k <= n; k++)
{
Console.WriteLine("({0, 2}, {1, 2}) = {2, 10}", n, k, NChooseK(n, k));
}
}
}
}
}
Output
-----------------------------------------------
( 1, 0) = 1
( 1, 1) = 1
-----------------------------------------------
( 2, 0) = 1
( 2, 1) = 2
( 2, 2) = 1
-----------------------------------------------
( 3, 0) = 1
( 3, 1) = 3
( 3, 2) = 3
( 3, 3) = 1
-----------------------------------------------
( 4, 0) = 1
( 4, 1) = 4
( 4, 2) = 6
( 4, 3) = 4
( 4, 4) = 1
-----------------------------------------------
( 5, 0) = 1
( 5, 1) = 5
( 5, 2) = 10
( 5, 3) = 10
( 5, 4) = 5
( 5, 5) = 1
-----------------------------------------------
( 6, 0) = 1
( 6, 1) = 6
( 6, 2) = 15
( 6, 3) = 20
( 6, 4) = 15
( 6, 5) = 6
( 6, 6) = 1
-----------------------------------------------
( 7, 0) = 1
( 7, 1) = 7
( 7, 2) = 21
( 7, 3) = 35
( 7, 4) = 35
( 7, 5) = 21
( 7, 6) = 7
( 7, 7) = 1
-----------------------------------------------
( 8, 0) = 1
( 8, 1) = 8
( 8, 2) = 28
( 8, 3) = 56
( 8, 4) = 70
( 8, 5) = 56
( 8, 6) = 28
( 8, 7) = 8
( 8, 8) = 1
-----------------------------------------------
( 9, 0) = 1
( 9, 1) = 9
( 9, 2) = 36
( 9, 3) = 84
( 9, 4) = 126
( 9, 5) = 126
( 9, 6) = 84
( 9, 7) = 36
( 9, 8) = 9
( 9, 9) = 1
-----------------------------------------------
(10, 0) = 1
(10, 1) = 10
(10, 2) = 45
(10, 3) = 120
(10, 4) = 210
(10, 5) = 252
(10, 6) = 210
(10, 7) = 120
(10, 8) = 45
(10, 9) = 10
(10, 10) = 1
-----------------------------------------------
(11, 0) = 1
(11, 1) = 11
(11, 2) = 55
(11, 3) = 165
(11, 4) = 330
(11, 5) = 462
(11, 6) = 462
(11, 7) = 330
(11, 8) = 165
(11, 9) = 55
(11, 10) = 11
(11, 11) = 1
-----------------------------------------------
(12, 0) = 1
(12, 1) = 12
(12, 2) = 66
(12, 3) = 220
(12, 4) = 495
(12, 5) = 792
(12, 6) = 924
(12, 7) = 792
(12, 8) = 495
(12, 9) = 220
(12, 10) = 66
(12, 11) = 12
(12, 12) = 1
-----------------------------------------------
(13, 0) = 1
(13, 1) = 13
(13, 2) = 78
(13, 3) = 286
(13, 4) = 715
(13, 5) = 1287
(13, 6) = 1716
(13, 7) = 1716
(13, 8) = 1287
(13, 9) = 715
(13, 10) = 286
(13, 11) = 78
(13, 12) = 13
(13, 13) = 1
-----------------------------------------------
(14, 0) = 1
(14, 1) = 14
(14, 2) = 91
(14, 3) = 364
(14, 4) = 1001
(14, 5) = 2002
(14, 6) = 3003
(14, 7) = 3432
(14, 8) = 3003
(14, 9) = 2002
(14, 10) = 1001
(14, 11) = 364
(14, 12) = 91
(14, 13) = 14
(14, 14) = 1
-----------------------------------------------
(15, 0) = 1
(15, 1) = 15
(15, 2) = 105
(15, 3) = 455
(15, 4) = 1365
(15, 5) = 3003
(15, 6) = 5005
(15, 7) = 6435
(15, 8) = 6435
(15, 9) = 5005
(15, 10) = 3003
(15, 11) = 1365
(15, 12) = 455
(15, 13) = 105
(15, 14) = 15
(15, 15) = 1
-----------------------------------------------
(16, 0) = 1
(16, 1) = 16
(16, 2) = 120
(16, 3) = 560
(16, 4) = 1820
(16, 5) = 4368
(16, 6) = 8008
(16, 7) = 11440
(16, 8) = 12870
(16, 9) = 11440
(16, 10) = 8008
(16, 11) = 4368
(16, 12) = 1820
(16, 13) = 560
(16, 14) = 120
(16, 15) = 16
(16, 16) = 1
-----------------------------------------------
(17, 0) = 1
(17, 1) = 17
(17, 2) = 136
(17, 3) = 680
(17, 4) = 2380
(17, 5) = 6188
(17, 6) = 12376
(17, 7) = 19448
(17, 8) = 24310
(17, 9) = 24310
(17, 10) = 19448
(17, 11) = 12376
(17, 12) = 6188
(17, 13) = 2380
(17, 14) = 680
(17, 15) = 136
(17, 16) = 17
(17, 17) = 1
-----------------------------------------------
(18, 0) = 1
(18, 1) = 18
(18, 2) = 153
(18, 3) = 816
(18, 4) = 3060
(18, 5) = 8568
(18, 6) = 18564
(18, 7) = 31824
(18, 8) = 43758
(18, 9) = 48620
(18, 10) = 43758
(18, 11) = 31824
(18, 12) = 18564
(18, 13) = 8568
(18, 14) = 3060
(18, 15) = 816
(18, 16) = 153
(18, 17) = 18
(18, 18) = 1
-----------------------------------------------
(19, 0) = 1
(19, 1) = 19
(19, 2) = 171
(19, 3) = 969
(19, 4) = 3876
(19, 5) = 11628
(19, 6) = 27132
(19, 7) = 50388
(19, 8) = 75582
(19, 9) = 92378
(19, 10) = 92378
(19, 11) = 75582
(19, 12) = 50388
(19, 13) = 27132
(19, 14) = 11628
(19, 15) = 3876
(19, 16) = 969
(19, 17) = 171
(19, 18) = 19
(19, 19) = 1
Press any key to continue . . .