巴斯卡三角形

 
巴斯卡三角形又叫杨辉三角,贾宪三角形 他有以下 性质:
前提:端点的数为1(这不是废话吗,头上那个端点不是1还是三角形吗)
1、每个数等于它上方两数之和。
2、每行数字左右对称,由1开始逐渐变大。
3、第n行的数字有n项。
4、第n行数字和为2n-1。
5、第n行的第m个数和第n-m+1个数相等,即C(n-1,m-1)=C(n-1,n-m)(组合数性质之一)
6、每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一。即
7、第n行的m个数可表示为C(n-1,m-1)(n-1下标,m-1上标),即为从n-1个不同
元素中取m-1个元素的组合数。组合数计算方法:C(n,m)=n!/[m!(n-m)!]
8、(a+b)^n的展开式中的各项系数依次对应杨辉三角的第(n+1)行中的每一项。
9、将第2n+1行第1个数,跟第2n+2行第3个数、第2n+3行第5个数……连成一线,这些数的和是第4n+1个斐波那契数;将第2n行第2个数(n>1),跟第2n-1行第4个数、第2n-2行第6个数……这些数之和是第4n-2个斐波那契数。
10、将各行数字相排列,可得11的n-1(n为行数)次方:1=11^0; 11=11^1; 121=11^2……;细心的人可能会发现当n≥5时会不符合这一条性质,其实是这样的:把第n行的最右面的数字"1"放在个位,然后把左面的一个数字的个位对齐到十位... ...,以此类推,把空位用“0”补齐,然后把所有的数加起来,得到的数正好是11的n-1次方。以n=11为例,第十一行的数为:1,10,45,120,210,252,210,120,45,10,1;
这些都是百科上面的,还是看图吧 
 有一个有趣的地方我们可以利用:上面的图片和下图等效
 
 
 
观察一下可以发现,n行r列可以表示为,我们对  展开可以得到                             
 
看到红色圈起来的部分了吗,上边和下边是一一对应的,一共有 r 项,现在好办了,可以用一个for循环迭代计算

利用这个for循环可以让i从1,2,3,4...一直取到r ,这样就完成了的计算。
 完整代码如下:
 1 #include <stdio.h>
 2 #define N 12
 3 long combi(int n, int r){
 4     int i;
 5     long p = 1;
 6     for(i = 1; i <= r; i++)
 7         p = p*(n-i+1) / i;
 8     return p;
 9 }
10 int main(void) {
11     int n, r;                     //n用来保存行,r用来保存列
12     for(n = 0; n <= N; n++) {     //循环输出共N+1行,从第0行,第1行,...,到第N行
13         for(r = 0; r <= n; r++) {    //循环输出每列
14             int i;
15             if(r == 0) {                 //第0列输出一大溜空格,空格数目等于N-n
16                 for(i = 0; i <= (N-n); i++)
17                     printf("   ");
18             }else {                 //0列之后,每列前面的空格个数都相等
19                 printf("   ");
20             } 
21             printf("%3d", combi(n, r));//输出空格结束之后输出对应列的值
22         }
23         printf("\n");//每行输出完毕后进行换行
24     }
25 
26     return 0;
27 }

 

运行效果: 
posted @ 2014-09-10 22:54  xxNote  阅读(1575)  评论(0编辑  收藏  举报