转载请注明出处:http://blog.csdn.net/u012572172/article/details/41173573
问题陈述:
杨辉三角如图所示:要求编程输出。
问题解法:
常规思路每个数字等于其"肩膀"上两数字之和,即a[i][j] = a[i-1][j-1] + a[i-1][j],代码稍有繁琐。
从代数的角度来考虑这个问题,可以得到一个通式:a[i][j] = a[i][0] * (i/1) * ((i-1)/2)) * ((i-2)/3) * ... * (1/i)。
公式可能比较抽象,举个例子说明 :(行列下标均从0开始)
第7行第1列 a[6][0] = 1;
第7行第2列 a[6][1] = 1 * 6/1;
第7行第3列 a[6][2] = 1 * 6/1 * 5/2;
第7行第4列 a[6][3] = 1 * 6/1 * 5/2 * 4/3;
第7行第5列 a[6][4] = 1 * 6/1 * 5/2 * 4/3 * 3/4;
第7行第6列 a[6][5] = 1 * 6/1 * 5/2 * 4/3 * 3/4 * 2/5;
第7行第7列 a[6][6] = 1 * 6/1 * 5/2 * 4/3 * 3/4 * 2/5 * 1/6;
代码详解:
/*
N:杨辉三角行数减一
combine(int n, int c) 计算第n行第c列的值 下标从0开始
*/
#include <stdio.h>
#include <stdlib.h>
#define N 12
long combine(int n, int c);
int main()
{
int i, j, k;
for(i=0; i<=N; i++) {
for(j=0; j<=i; j++) {
if(j == 0) {
for(k=0; k<N-i; k++){
printf(" ");
}
}else {
printf(" ");
}
printf("%3d", combine(i, j));
}
printf("\n");
}
return 0;
}
long combine(int n, int c) {
int i;
long p = 1;
for(i=1; i<=c; i++) {
p = p*(n-i+1) / i;
}
return p;
}