首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【重生之学习C语言----杨辉三角篇】

【重生之学习C语言----杨辉三角篇】

作者头像
用户11456817
发布2025-02-07 12:32:59
发布2025-02-07 12:32:59
19200
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

一、什么是杨辉三角?

杨辉三角(Pascal's Triangle)是二项式系数在三角形中的一种几何排列。它具有以下特点:

  1. 每行首尾为1
  2. 每个数是其左上方和右上方数之和
  3. 第n行有n个数

例如,前5行杨辉三角如下:

代码语言:javascript
代码运行次数:0
运行
复制
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

二、问题分析

要实现杨辉三角的打印,需要解决以下问题:

  • 确定行数:用户输入或指定打印的行数。
  • 计算每行的值
    • 每行的第一个和最后一个数为1。
    • 中间的数等于上一行左上方和右上方的数之和。
  • 格式化输出:使杨辉三角居中显示。

三、算法设计

  1. 使用二维数组存储杨辉三角
    • 数组的行和列分别对应杨辉三角的行和列。
  2. 递推关系
    • 每行的第一个和最后一个数为1。
    • 其他数满足:a[i][j] = a[i-1][j-1] + a[i-1][j]
  3. 格式化输出
    • 使用空格对齐每行的数字。

四、代码实现

  • 完整代码:
代码语言:javascript
代码运行次数:0
运行
复制
#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 函数打印杨辉三角。

五、运行结果

代码语言:javascript
代码运行次数:0
运行
复制
请输入杨辉三角的行数(1-20):5
        1
      1   1
    1   2   1
  1   3   3   1
1   4   6   4   1

六、关键问题与优化

  • 为什么使用二维数组
    • 二维数组可以直观地存储杨辉三角的每一行和每一列的值。
  • 如何处理更大的行数
    • 调整 MAX_ROWS 的值,但需注意内存限制。
  • 优化空间复杂度
    • 使用一维数组存储当前行和上一行,减少内存占用。
代码语言:javascript
代码运行次数:0
运行
复制
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];
        }
    }
}

七、总结

通过本博客,你学会了:

  1. 杨辉三角的定义与数学原理。
  2. 递推关系的应用:如何通过上一行计算当前行的值。
  3. C语言实现技巧:二维数组、循环、格式化输出。
  4. 优化思路:如何减少内存占用。

动手挑战:尝试修改代码,打印出前10行杨辉三角,并在评论区分享你的结果!

路过的佬们点点关注哦~

你们的鼓励是我前进的动力~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、什么是杨辉三角?
  • 二、问题分析
  • 三、算法设计
  • 四、代码实现
  • 五、运行结果
  • 六、关键问题与优化
  • 七、总结
  • 路过的佬们点点关注哦~
  • 你们的鼓励是我前进的动力~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档