【问题描述】杨辉三角是一个由数字排列成的三角形数表,一般形式如下:
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
2 |
|
1 |
|
|
|
|
|
|
|
|
|
|
1 |
|
3 |
|
3 |
|
1 |
|
|
|
|
|
|
|
|
1 |
|
4 |
|
6 |
|
4 |
|
1 |
|
|
|
|
|
|
1 |
|
5 |
|
10 |
|
10 |
|
5 |
|
1 |
|
|
|
|
1 |
|
6 |
|
15 |
|
20 |
|
15 |
|
6 |
|
1 |
|
|
1 |
|
7 |
|
21 |
|
35 |
|
35 |
|
21 |
|
7 |
|
1 |
| … |
|
|
… |
|
|
|
… |
|
|
|
… |
|
|
… |
杨辉三角最本质的特征是,它的两条斜边都是由数字1组成的,而其余的数则是等于它肩上的两个数之和。其实,中国古代数学家在数学的许多重要领域中处于遥遥领先的地位。中国古代数学史曾经有自己光辉灿烂的篇章,而杨辉三角的发现就是十分精彩的一页。杨辉,字谦光,北宋时期杭州人。在他1261年所著的《详解九章算法》一书中,辑录了如上所示的三角形数表,称之为“开方作法本源”图。而这样一个三角在我们的奥数竞赛中也是经常用到,最简单的就是叫你找规律。现在要求我们用编程的方法输出这样的数表。
【分析】
|
|
0 |
|
|
|
|
|
|
|
|
|
←先构造符合杨辉三角的数据,如左边所示 |
|
|
|
|
|
|
|
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
1 |
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
2 |
|
1 |
|
|
|
|
|
|
|
|
|
|
1 |
|
3 |
|
3 |
|
1 |
|
|
|
|
|
|
|
|
1 |
|
4 |
|
6 |
|
4 |
|
1 |
|
|
|
|
|
|
1 |
|
5 |
|
10 |
|
10 |
|
5 |
|
1 |
|
|
|
|
1 |
|
6 |
|
15 |
|
20 |
|
15 |
|
6 |
|
1 |
|
|
1 |
|
7 |
|
21 |
|
35 |
|
35 |
|
21 |
|
7 |
|
1 |
| … |
|
|
… |
|
|
|
… |
|
|
|
… |
|
|
… |
|
|
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
|
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
|
0 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
|
0 |
1 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
|
4 |
0 |
1 |
3 |
3 |
1 |
0 |
0 |
0 |
0 |
0 |
|
|
|
0 |
1 |
4 |
6 |
4 |
1 |
0 |
0 |
0 |
0 |
然后用能体现杨辉三角规律的形式显示这些数据,如右边所示→ |
|
|
0 |
1 |
5 |
10 |
10 |
5 |
1 |
0 |
0 |
0 |
|
7 |
0 |
1 |
6 |
15 |
20 |
15 |
6 |
1 |
0 |
0 |
|
|
0 |
1 |
7 |
21 |
35 |
35 |
21 |
7 |
1 |
0 |
|
|
|
|
|
|
… |
|
|
|
|
… |
【Pascal实现】
program yanghui;
const line=13;
var
a:array[0..line,0..line] of integer;
i,j,n:integer;
begin
write("Input N(N<=13):"); {这样有利于在屏幕上得到完整的显示效果,算法可以推广到任何数}
readln(n);
fillchar(a,sizeof(a),0); {构造符合杨辉三角的数据,a[1,1]至a[n,n]}
a[0,0]:=1;
for i:=1 to n do
for j:=1 to i do a[i,j]:=a[i-1,j-1]+a[i-1,j];
for i:=1 to n do {用能体现杨辉三角规律的形式显示这些数据}
begin
for j:=1 to n-i do write(" ");
for j:=1 to i do write(a[i,j]:3," ");
writeln;
end;
readln;
end.
【C实现】
#include<stdio.h>
#define LINE 14
void main()
{
int a[LINE][LINE],i,j,n;
printf("Input N(N<=13)");
scanf("%d",&n);
for (i=0;i<=n;i++)
{
for (j=0;j<=n;j++) a[i][j]=0;
}
a[0][0]=1;
for (i=1;i<=n;i++)
for (j=1;j<=n;j++) a[i][j]=a[i-1][j-1]+a[i-1][j];
for (i=1;i<=n;i++)
{
for(j=1;j<=n-i;j++) printf(" ");
for(j=1;j<=i;j++) printf("%3d ",a[i][j]);
printf("\n");
}
getch();
}