目录
--------------------------------------begin----------------------------------------
-------------------------------------end-------------------------------------------
--------------------------------------begin----------------------------------------
一、什么是杨辉三角?
杨辉三角(Pascal's Triangle)是二项式系数在三角形中的一种几何排列。它具有以下特点:
每行首尾为1。
每个数是其左上方和右上方数之和。
第n行有n个数。
例如,前5行杨辉三角如下:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
二、问题分析
要实现杨辉三角的打印,需要解决以下问题:
确定行数:用户输入或指定打印的行数。
计算每行的值:
每行的第一个和最后一个数为1。
中间的数等于上一行左上方和右上方的数之和。
格式化输出:使杨辉三角居中显示。
三、算法设计
使用二维数组存储杨辉三角:
数组的行和列分别对应杨辉三角的行和列。
递推关系:
每行的第一个和最后一个数为1。
其他数满足:
a[i][j] = a[i-1][j-1] + a[i-1][j]
。
格式化输出:
使用空格对齐每行的数字。
四、代码实现
完整代码:
#include <stdio.h>
#define MAX_ROWS 20 // 定义最大行数
void printPascalTriangle(int rows) {
int triangle[MAX_ROWS][MAX_ROWS];
// 填充杨辉三角
for (int i = 0; i < rows; i++) {
// 每行首尾为1
triangle[i][0] = 1;
triangle[i][i] = 1;
// 计算中间的值
for (int j = 1; j < i; j++) {
triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j];
}
}
// 打印杨辉三角
for (int i = 0; i < rows; i++) {
// 打印前导空格,使三角形居中
for (int space = 0; space < rows - i - 1; space++) {
printf(" ");
}
// 打印当前行的数字
for (int j = 0; j <= i; j++) {
printf("%4d", triangle[i][j]);
}
printf("\n");
}
}
int main() {
int rows;
// 输入行数
printf("请输入杨辉三角的行数(1-%d):", MAX_ROWS);
scanf("%d", &rows);
if (rows < 1 || rows > MAX_ROWS) {
printf("输入的行数无效!\n");
return 1;
}
// 打印杨辉三角
printPascalTriangle(rows);
return 0;
}
代码解析:
printPascalTriangle
函数:填充杨辉三角:
使用二维数组
triangle
存储杨辉三角的值。每行的第一个和最后一个数为1。
中间的数通过递推关系计算:
triangle[i][j] = triangle[i-1][j-1] + triangle[i-1][j]
。
打印杨辉三角:
使用前导空格使每行居中。
使用
%4d
格式化输出,确保数字对齐。
main
函数:获取用户输入的行数。
检查输入是否有效。
调用
printPascalTriangle
函数打印杨辉三角。
五、运行结果
请输入杨辉三角的行数(1-20):5
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
六、关键问题与优化
为什么使用二维数组?
二维数组可以直观地存储杨辉三角的每一行和每一列的值。
如何处理更大的行数?
调整
MAX_ROWS
的值,但需注意内存限制。
优化空间复杂度:
使用一维数组存储当前行和上一行,减少内存占用。
void printPascalTriangleOptimized(int rows) {
int prev[MAX_ROWS], curr[MAX_ROWS];
for (int i = 0; i < rows; i++) {
curr[0] = 1;
curr[i] = 1;
for (int j = 1; j < i; j++) {
curr[j] = prev[j-1] + prev[j];
}
// 打印当前行
for (int space = 0; space < rows - i - 1; space++) {
printf(" ");
}
for (int j = 0; j <= i; j++) {
printf("%4d", curr[j]);
}
printf("\n");
// 更新上一行
for (int j = 0; j <= i; j++) {
prev[j] = curr[j];
}
}
}
七、总结
通过本博客,你学会了:
杨辉三角的定义与数学原理。
递推关系的应用:如何通过上一行计算当前行的值。
C语言实现技巧:二维数组、循环、格式化输出。
优化思路:如何减少内存占用。
动手挑战:尝试修改代码,打印出前10行杨辉三角,并在评论区分享你的结果!