C语言打印杨辉三角

杨辉三角形是一个由数字排列组成的三角形数表。其一般形式如图 1 所示,每行开始和结尾处的数字都为 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