C语言实现杨辉三角的生成与打印
杨辉三角,又称帕斯卡三角形,是一个简单却非常重要的数学工具。它不仅在组合数学中有广泛应用,也为程序设计提供了一个经典的练习题目。本文将带你了解杨辉三角的概念,并用 C 语言实现它的生成与打印。
什么是杨辉三角?
杨辉三角是一个排列的三角形,三角形中的每个数字是它上一行的两个相邻数字之和,边界上的数字恒为 1。例如:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
数学公式为:
- 第一行和每行的第一个数为 1,即 (C(n, 0) = 1)。
- 第 (n) 行的第 (k) 个数为 (C(n, k) = C(n-1, k-1) + C(n-1, k))。
实现思路
我们将通过以下步骤用 C 语言生成和打印杨辉三角:
- 定义数据结构:使用二维数组存储杨辉三角。
- 填充数组:根据杨辉三角的规律填充数组。
- 打印结果:遍历数组并打印每一行。
C 语言代码实现
以下是完整的 C 语言代码:
#include <stdio.h>
#define MAX_ROWS 10 // 定义杨辉三角的最大行数
void generateYangHuiTriangle(int triangle[MAX_ROWS][MAX_ROWS], int rows) {
for (int i = 0; i < rows; i++) {
triangle[i][0] = 1; // 每行的第一个数字为 1
triangle[i][i] = 1; // 每行的最后一个数字为 1
for (int j = 1; j < i; j++) {
triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j];
}
}
}
void printYangHuiTriangle(int triangle[MAX_ROWS][MAX_ROWS], int rows) {
for (int i = 0; i < rows; i++) {
// 打印空格,保持三角形形状
for (int k = 0; k < rows - i - 1; k++) {
printf(" ");
}
// 打印数字
for (int j = 0; j <= i; j++) {
printf("%4d", triangle[i][j]);
}
printf("\n");
}
}
int main() {
int triangle[MAX_ROWS][MAX_ROWS] = {0};
int rows;
printf("请输入杨辉三角的行数(最多 %d 行):", MAX_ROWS);
scanf("%d", &rows);
if (rows > MAX_ROWS || rows <= 0) {
printf("输入的行数无效,请输入 1 到 %d 之间的数字。\n", MAX_ROWS);
return 1;
}
generateYangHuiTriangle(triangle, rows);
printf("生成的杨辉三角为:\n");
printYangHuiTriangle(triangle, rows);
return 0;
}
代码解析
1. 定义二维数组
int triangle[MAX_ROWS][MAX_ROWS] = {0};
二维数组 triangle
用于存储杨辉三角的每个数字。
2. 填充杨辉三角
函数 generateYangHuiTriangle
通过双重循环生成杨辉三角:
- 外层循环处理每一行。
- 内层循环通过公式 (C(n, k) = C(n-1, k-1) + C(n-1, k)) 填充非边界数字。
3. 格式化打印
函数 printYangHuiTriangle
控制输出格式,通过打印空格调整形状,并保证数字对齐。
运行效果
假设输入 5
行,程序的输出结果如下:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
优化建议
- 动态内存分配:当前实现使用了固定大小的二维数组,可以改为动态分配内存,以支持任意大小的杨辉三角。
- 减少内存使用:仅存储当前行和上一行,避免存储整个三角形。
- 并行计算:对于大规模杨辉三角的生成,可以利用多线程并行化加速计算。
总结
本文从杨辉三角的定义入手,结合数学规律,详细讲解了如何用 C 语言实现杨辉三角的生成和打印。通过这个练习,不仅可以巩固对二维数组的理解,还能体会到递推公式在程序设计中的妙用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)