杨辉三角
巴斯卡三角,又叫杨辉三角,又名贾宪三角。
说来,这也算是大一新生算法入门的东西了,同样的还有什么打印菱形等,不过都差不多。
兼有性质:
- 左右对称,中间最大
- 开头为1
- 每一个数等于其上方两数之和(除前两行)
- 第n行有n项,和为(2n-1)
记得上高中时就开始研究杨辉三角,当时有一个公式:
这个大家应该很熟知吧。
好,我们再来看一张杨辉三角图
这就是文章后面代码的运行结果图,简化一下,就是下面的图:
是不是很明了呢?
那么,我们再回到公式,将其展开,如下:
是不是会发现一个规律?
没错,就是这几行代码的来源:
方法就是for循环的迭代,一共有n行i列。
下面,上代码:
#include <stdio.h>
#define N 12
long combi(int n, int r){
int i;
long p = 1;
for(i = 1; i <= r; i++)
p = p*(n-i+1) / i;
return p;
}
int main(void) {
int n, r; //n用来保存行,r用来保存列
for(n = 0; n <= N; n++) { //循环输出共N+1行,从第0行,第1行,...,到第N行
for(r = 0; r <= n; r++) { //循环输出每列
int i;
if(r == 0) { //第0列输出一大溜空格,空格数目等于N-n
for(i = 0; i <= (N-n); i++)
printf(" ");
}else { //0列之后,每列前面的空格个数都相等
printf(" ");
}
printf("%3d", combi(n, r));//输出空格结束之后输出对应列的值
}
printf("\n");//每行输出完毕后进行换行
}
return 0;
}
本文灵感来源于前辈博客:http://www.cnblogs.com/xxNote/articles/3965362.html
如有错误,请指正!