杨辉三角形是一个由数字排列组成的三角形数表。其一般形式如图 1 所示,每行开始和结尾处的数字都为 1,其他数字都是它所在行的上一行中靠近它的两个数之和。
请编程输出其中的前 n(n≤20)行。
输入:一个正整数,表示杨辉三角形的行数。
输出:n行杨辉三角形。
仔细观察杨辉三角形可以发现,其数字是有规律的,每行的第一个和最后一个数字都为 1,而且从第 3 行开始,其他位置的数字都是它所在行的上一行中靠近它的两个数之和。
因为数字比较多,而且分布在多行,我们可以用一个二维数组来存储和处理这些数字。如此,则从第 3 行开始,除行首和行尾之外的其他任意数字 t[i][j] 就等于其上一行的数字 t[i-1][j-1] 和 t[i-1][j] 之和,即:
t[i][j] = t[i-1][j-1] + t[i-1][j]
第一行和第二行的数字以及其他所有处在行首和行尾的数字都为 1,即:
t[0][0] = 1 //第一行 t[1][0] = 1 t[1][1] = 1 //第二行 t[i][0] = 1 t[i][i] = 1 //其他行首和行尾
另外,行数增大后,处在行中间位置的数字会大于 int 型的最大取值范围 32767,因此,我们定义二维数组的类型为 long int 型。
1) 输入欲打印的行数 n;
2) 初始化第一行的 t[0][0] 和第二行的 t[1][0]、t[1][1];
3) 循环变量 i(2~n-1)控制处理 3~n 行的数组元素赋值:当前行行首数组元素赋值为1;
循环变量 j(1~i-1)控制处理当前行中间位置的数组元素赋值:t[i][j]=t[i-1][j-1]+t[i-1][j];当前行行尾数组元素赋值为1;
4) 循环变量 i(0~n-1)、j(0~i)控制遍历数组并输出杨辉三角形;
5) 结束。
代码清单 2:输入 20 行以内的杨辉三角形
#include <stdio.h>
#include <stdlib.h>
int main( )
{
int n,i,j;
printf("输入欲打印的行数n(2<n≤20):");
scanf("%d",&n);
if(n>20) n=20;
long t[20][20]={[0][0]=1,[1][0]=1,[1][1]=1};//前2行赋初值
for(i=2;i<n;i++) //用for循环给3~n行元素赋值
{
t[i][0]=1;
for(j=1;j<i;j++)
t[i][j]=t[i-1][j-1]+t[i-1][j];
t[i][i]=1;
}
for(i=0;i<n;i++) //输出杨辉三角形
{
for(j=0;j<=i;j++) //用for循环遍历并打印一行所有数字
printf("%d ",t[i][j]);
printf("\n"); //打印完一行后换行
}
system("pause");
return 0;
}
运行结果为:
输入欲打印的行数n(2<n≤20):6 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1