P5732 杨辉三角
题目描述:给出 n(n≤20),输出杨辉三角的前n行。
杨辉三角是一种神奇的三角形,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。
杨辉三角前6行样例为:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
我们不难发现,每一项都等于它上方和左上方项数之和。
由此我们便可以写出杨辉三角的通项公式:
a[i][j]=a[i-1][j-1]+a[i-1][j]
于是我们便能写出代码:
#include<iostream> #include<cstdio> using namespace std; int n,a[25][25]; int main() { scanf("%d",&n); a[1][1]=1;a[2][1]=1;a[2][2]=1;a[3][1]=1;a[3][2]=2;a[3][3]=1; //给前几项赋值 for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { a[i][j]=a[i-1][j-1]+a[i-1][j]; } } for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++)
{ cout<<a[i][j]<<" "; if(i==j) //判断换行 { cout<<endl; } } } return 0; }
然而运行结果却不尽如人意,并没有得到杨辉三角,反而出现了许多很大的数。很明显,程序需要改进。
我们再看一下杨辉三角。我们可以发现,它的第一列和每行最后一项都为“1”,即:
if(j==1) { a[i][j]=1; } if(i==j) { a[i][j]=1; }
故程序可以升级为:
#include<iostream> #include<cstdio> using namespace std; int n,a[25][25]; int main() { scanf("%d",&n); a[1][1]=1;a[2][1]=1;a[2][2]=1;a[3][1]=1;a[3][2]=2;a[3][3]=1; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { a[i][j]=a[i-1][j-1]+a[i-1][j]; if(j==1) //处理第一列 { a[i][j]=1; } if(i==j) //处理每行最后一个 { a[i][j]=1; } } } for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { cout<<a[i][j]<<" "; if(i==j) { cout<<endl; } } } return 0; }
此时运行就没问题了,可以AC。
杨辉三角还有其他性质,比如将每一项都模2,就有:
1
1 1
1 0 1
1 1 1 1
1 0 0 0 1
1 1 0 0 1 1
1 0 1 0 1 0 1
1 1 1 1 1 1 1 1
此时杨辉三角成了只由“0”、“1”组成的三角。