2013年3月2日 星期六

[C Programming] 二項式係數加法解

請寫一個程式,只用加法,求出n中取r個的組合係數C(n,r);
並且盡可能地使加法數目減低。

答:
在提到二項式係數時我們就會想到帕斯卡三角形。
(From wikipedia)
0:1
1:11
2:121
3:1331
4:14641
5:15101051
6:1615201561
7:21353521
8:2856705628

帕斯卡三角形提醒了我們一件事:C(n, r) = C(n-1, r-1) + C(n-1, r)。
當我們計算C(n, r)的時候,比如圖中的C(7, 4) = 35,
我們就是往其上面找C(6, 3)和C(6, 4),以此類推,
也就是說我們只要從最頂端,每次往下計算藍色斜線的部分,
總共計算3排斜線(第一排為1就直接指定即可)
也就是說我們每次要算r個數,總共算n-r行,就可以得到答案。

Code:
#define MAXSIZE 100

unsigned long cnt(int n, int r)
{
 unsinged long c[MAXSIZE];
 int i, j;
 for( i = 0; i <= r; i++ )
  c[i] = 1;
 for( i = 1; i <= n-r; i++ )    // 一共有n-r列
  for( j = 1; j <= r; j++ )  // 每次要算r個數
   c[j] += c[j+1];        // 由左上將C(i,j)逐次推到C(i+1,j)
 return c[r]; 
}

沒有留言:

張貼留言