C 语言实战:打印杨辉三角前 10 行(二维数组实现 + 规律拆解)

42 阅读6分钟

C 语言实战:打印杨辉三角前 10 行(二维数组实现 + 规律拆解)

杨辉三角(帕斯卡三角)是二维数组的经典应用,其核心规律是 “每行首尾为 1,中间元素 = 上一行相邻两元素之和”。本文通过完整的 C 语言代码实现杨辉三角前 10 行的打印,拆解数组初始化、元素递推、格式输出的核心逻辑,优化代码规范性与可读性,帮助掌握杨辉三角的生成原理。

一、杨辉三角核心规则

对于 n 行杨辉三角(行号i、列号j均从 0 开始):

  1. 边界元素:每行第一个元素(j=0)和最后一个元素(j=i)固定为 1;
  2. 中间元素:第i行第j列元素 = 第i-1行第j-1列元素 + 第i-1行第j列元素(i>10<j<i);
  3. 输出规则:第i行仅输出前i+1个元素(列号j≤i),保证三角形态。

二、优化后完整代码(规范 + 易读)

c

运行

/******************************
*文件名称:5.Pascal_Triangle.c
*作者:czy
*邮箱:caozhiyang_0613@163.com
*创建日期:2025/12/29
*修改日期:2025/12/29
*文件功能:按三角格式打印杨辉三角的前 10 行
*核心思路:
*  1. 边界初始化:每行首尾元素(j=0、j=i)赋值为1;
*  2. 中间元素递推:a[i][j] = a[i-1][j-1] + a[i-1][j];
*  3. 格式输出:第i行仅输出前i+1个元素(j≤i)。
*****************************/
#include<stdio.h>

#define ROW 10 // 杨辉三角行数,便于修改

int main()
{
    int a[ROW][ROW] = {0}; // 初始化二维数组为0,避免随机值
    int i, j;

    // 步骤1:生成杨辉三角数据
    for(i = 0; i < ROW; i++)
    {
        // 边界元素:首尾赋值为1
        a[i][0] = 1;    // 每行第一个元素为1
        a[i][i] = 1;    // 每行最后一个元素为1

        // 中间元素:仅i>1时计算(前两行无中间元素)
        if(i > 1)
        {
            // j从1到i-1,仅计算中间元素(避免越界)
            for(j = 1; j < i; j++)
            {
                a[i][j] = a[i-1][j-1] + a[i-1][j];
            }
        }
    }

    // 步骤2:按三角格式输出杨辉三角
    printf("杨辉三角的前 %d 行为:\n", ROW);
    for(i = 0; i < ROW; i++)
    {
        // 第i行仅输出前i+1个元素(j≤i)
        for(j = 0; j <= i; j++)
        {
            printf("%d ", a[i][j]);
        }
        printf("\n"); // 每行结束换行
    }

    return 0;
}

三、核心逻辑拆解

1. 数组初始化与边界赋值

c

运行

int a[ROW][ROW] = {0}; // 初始化为0,避免未赋值元素为随机数
for(i = 0; i < ROW; i++)
{
    a[i][0] = 1;    // 每行首元素为1
    a[i][i] = 1;    // 每行尾元素为1
    // ... 中间元素计算
}
  • 二维数组a[ROW][ROW]初始化为 0,确保未计算的中间元素初始值为 0;
  • 每行首尾元素直接赋值为 1,是杨辉三角的基础边界条件。

2. 中间元素递推计算

c

运行

if(i > 1) // 前两行(i=0i=1)无中间元素,无需计算
{
    for(j = 1; j < i; j++) // j从1i-1,仅处理中间元素
    {
        a[i][j] = a[i-1][j-1] + a[i-1][j];
    }
}
关键验证(以 i=2 为例):
  • i=2(第 3 行),j=1:a[2][1] = a[1][0] + a[1][1] = 1 + 1 = 2
  • i=3(第 4 行),j=1:a[3][1] = a[2][0] + a[2][1] = 1 + 2 = 3
  • i=3(第 4 行),j=2:a[3][2] = a[2][1] + a[2][2] = 2 + 1 = 3
  • 原代码中j<9存在冗余(如 i=3 时 j 只需到 2),优化为j<i更精准,避免无效循环。

3. 三角格式输出

c

运行

for(i = 0; i < ROW; i++)
{
    for(j = 0; j <= i; j++) // 第i行输出i+1个元素
    {
        printf("%d ", a[i][j]);
    }
    printf("\n");
}
  • 第 0 行(i=0)输出 j=0 → 1 个元素;
  • 第 1 行(i=1)输出 j=0、1 → 2 个元素;
  • 第 9 行(i=9)输出 j=0~9 → 10 个元素;
  • 逐行输出形成标准的三角形态,符合杨辉三角的视觉特征。

四、运行结果示例

plaintext

杨辉三角的前 10 行为:
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 8 28 56 70 56 28 8 1 
1 9 36 84 126 126 84 36 9 1 

五、原代码优化说明

对比原始代码,核心优化点:

  1. 宏定义行数:新增#define ROW 10,修改行数时仅需改宏定义,无需逐行调整;
  2. 循环边界优化:将j<9改为j<i,避免 i 较小时的无效循环(如 i=3 时 j 无需到 8);
  3. 代码注释增强:补充关键逻辑注释,提升可读性;
  4. 初始化规范:明确数组初始化为 0,避免随机值干扰;
  5. 输出格式优化:统一输出提示语,格式更整洁。

六、扩展优化思路

1. 对齐输出(更美观的三角形态)

通过添加空格实现左对齐,提升视觉效果:

c

运行

// 输出前添加空格,每行缩进(ROW-i)个空格
for(i = 0; i < ROW; i++)
{
    // 缩进空格,使三角居中
    for(int k = 0; k < ROW - i; k++)
    {
        printf("  ");
    }
    for(j = 0; j <= i; j++)
    {
        printf("%4d", a[i][j]); // 每个数字占4位,对齐
    }
    printf("\n");
}

输出效果(居中对齐):

plaintext

                  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   8  28  56  70  56  28   8   1 
1   9  36  84 126 126  84  36   9   1 

2. 支持自定义行数

新增输入功能,让用户指定输出行数:

c

运行

int row;
printf("请输入杨辉三角的行数(正整数):");
scanf("%d", &row);
if(row <= 0 || row > 20) // 限制最大行数,避免数组越界
{
    printf("行数需为1~20的正整数!");
    return 1;
}
// 后续逻辑将ROW替换为row

七、新手避坑指南

  1. 数组未初始化:若未赋值{0},未计算的中间元素为随机数,输出结果错误;
  2. 循环边界错误:中间元素循环若写j<=i,会重复赋值首尾元素(虽不影响结果,但冗余);
  3. 输出范围错误:若输出时写j<ROW,会输出每行所有 10 个元素(包括 0),破坏三角形态;
  4. 递推公式错误:误将a[i][j] = a[i-1][j-1] + a[i-1][j]写为a[i][j] = a[i][j-1] + a[i-1][j],导致元素计算错误。