巴斯卡三角形
巴斯卡三角形又叫杨辉三角,贾宪三角形 他有以下 性质:
前提:端点的数为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;
这些都是百科上面的,还是看图吧
有一个有趣的地方我们可以利用:上面的图片和下图等效
看到红色圈起来的部分了吗,上边和下边是一一对应的,一共有 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 }
运行效果: