計算二項式係數

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 . . .


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章