巴斯卡(Pascal)三角形基本上就是在计算 rCn ,其中 r 为行(row),n 为列(column)。因为三角形上的每一个数字都会对应一个 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
以上部分转载:http://c.biancheng.net/cpp/html/2879.html
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>//此为c程序,后缀为.c
#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 ;
int s ;
int t ;
for ( r = 0 ; r < HEIGHT ; r ++) {
int n;
char format [ 5 ];
sprintf ( format , "%% %ds" , ( HEIGHT - r ) * 3 );
printf ( format , "" );//format为字符数组,format里面的内容为% 36s, 这正好为printf函数提供了打印""内容的格式。
for ( n = 0 ; n <= r ; n ++) {
printf ( "%6d" , combi ( r , n ));
}
printf ( "\n" );
}
getch();
}
以上部分转载:http://c.biancheng.net/cpp/html/2879.html