C 语言实战:打印杨辉三角前 10 行(二维数组实现 + 规律拆解)
杨辉三角(帕斯卡三角)是二维数组的经典应用,其核心规律是 “每行首尾为 1,中间元素 = 上一行相邻两元素之和”。本文通过完整的 C 语言代码实现杨辉三角前 10 行的打印,拆解数组初始化、元素递推、格式输出的核心逻辑,优化代码规范性与可读性,帮助掌握杨辉三角的生成原理。
一、杨辉三角核心规则
对于 n 行杨辉三角(行号i、列号j均从 0 开始):
- 边界元素:每行第一个元素(
j=0)和最后一个元素(j=i)固定为 1; - 中间元素:第
i行第j列元素 = 第i-1行第j-1列元素 + 第i-1行第j列元素(i>1且0<j<i); - 输出规则:第
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=0、i=1)无中间元素,无需计算
{
for(j = 1; j < i; j++) // j从1到i-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
五、原代码优化说明
对比原始代码,核心优化点:
- 宏定义行数:新增
#define ROW 10,修改行数时仅需改宏定义,无需逐行调整; - 循环边界优化:将
j<9改为j<i,避免 i 较小时的无效循环(如 i=3 时 j 无需到 8); - 代码注释增强:补充关键逻辑注释,提升可读性;
- 初始化规范:明确数组初始化为 0,避免随机值干扰;
- 输出格式优化:统一输出提示语,格式更整洁。
六、扩展优化思路
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
七、新手避坑指南
- 数组未初始化:若未赋值
{0},未计算的中间元素为随机数,输出结果错误; - 循环边界错误:中间元素循环若写
j<=i,会重复赋值首尾元素(虽不影响结果,但冗余); - 输出范围错误:若输出时写
j<ROW,会输出每行所有 10 个元素(包括 0),破坏三角形态; - 递推公式错误:误将
a[i][j] = a[i-1][j-1] + a[i-1][j]写为a[i][j] = a[i][j-1] + a[i-1][j],导致元素计算错误。