C语言巴斯卡三角问题
巴斯卡(Pascal)三角形基本上就是在计算 rCn ,其中 r 为行(row),n 为列(column)。因为三角形上的每一个数字都会对应一个 rCn,如下:
0C0
1C0 1C1
2C0 2C1 2C2
3C0 3C1 3C2 3C3
4C0 4C1 4C2 4C3 4C4
对应的数字如下图所示:
rC0 = 1
rCn = rCn-1 * (r - n + 1) / n
解决了计算 rCn 的问题,剩下的问题就是如何将这些数字排列成三角形了。
代码实现:
0C0
1C0 1C1
2C0 2C1 2C2
3C0 3C1 3C2 3C3
4C0 4C1 4C2 4C3 4C4
对应的数字如下图所示:
解题思路
巴斯卡三角形中的 rCn 可以使用下面的公式来计算,以避免阶乘运算时的数值溢出:rC0 = 1
rCn = rCn-1 * (r - n + 1) / n
解决了计算 rCn 的问题,剩下的问题就是如何将这些数字排列成三角形了。
代码实现:
#include <stdio.h> #define HEIGHT 12 int combi ( int r , int n ){ int p = 1 ; int i ; for ( i = 1 ; i <= n ; i ++) { p = p * ( r - i + 1 ) / i ; } return p ; } int main () { int r ; for ( r = 0 ; r < HEIGHT ; r ++) { char format [ 5 ]; sprintf ( format , "%% %ds" , ( HEIGHT - r ) * 3 ); printf ( format , "" ); int n ; for ( n = 0 ; n <= r ; n ++) { printf ( "%6d" , combi ( r , n )); } printf ( "\\n" ); } return 0 ; }