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

news2025/3/11 11:19:27

目录

​编辑

--------------------------------------begin----------------------------------------

一、什么是杨辉三角?

二、问题分析

三、算法设计

使用二维数组存储杨辉三角:

递推关系:

格式化输出:

四、代码实现

 完整代码:

代码解析:

五、运行结果

六、关键问题与优化

为什么使用二维数组?

如何处理更大的行数?

优化空间复杂度:

七、总结

路过的佬们点点关注哦~

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

-------------------------------------end-------------------------------------------


--------------------------------------begin----------------------------------------

一、什么是杨辉三角?

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

  1. 每行首尾为1

  2. 每个数是其左上方和右上方数之和

  3. 第n行有n个数

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

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. 格式化输出
    • 使用空格对齐每行的数字。


四、代码实现

  •  完整代码:
#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];
        }
    }
}

七、总结

通过本博客,你学会了:

  1. 杨辉三角的定义与数学原理。

  2. 递推关系的应用:如何通过上一行计算当前行的值。

  3. C语言实现技巧:二维数组、循环、格式化输出。

  4. 优化思路:如何减少内存占用。


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

路过的佬们点点关注哦~

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

-------------------------------------end-------------------------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2294262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW自定义测量参数怎么设置?

以下通过一个温度采集案例&#xff0c;说明在 LabVIEW 中设置自定义测量参数的具体方法&#xff1a; 案例背景 ​ 假设使用 NI USB-6009 数据采集卡 和 热电偶传感器 监测温度&#xff0c;需自定义以下参数&#xff1a; 采样率&#xff1a;1 kHz 输入量程&#xff1a;0~10 V&a…

Vim的基础命令

移动光标 H(左) J(上) K(下) L(右) $ 表示移动到光标所在行的行尾&#xff0c; ^ 表示移动到光标所在行的行首的第一个非空白字符。 0 表示移动到光标所在行的行首。 W 光标向前跳转一个单词 w光标向前跳转一个单词 B光标向后跳转一个单词 b光标向后跳转一个单词 G 移动光标到…

复制粘贴小工具——Ditto

在日常工作中&#xff0c;复制粘贴是常见的操作&#xff0c;但Windows系统自带的剪贴板功能较为有限&#xff0c;只能保存最近一次的复制记录&#xff0c;这对于需要频繁复制粘贴的用户来说不太方便。今天&#xff0c;我们介绍一款开源、免费且功能强大的剪贴板增强工具——Dit…

中国人名汉语拼音字母拼写规则

中国人名汉语拼音字母拼写规则 1. Lv and Lyu2. 中国人名汉语拼音字母拼写规则References 1. Lv and Lyu LongBench: A Bilingual, Multitask Benchmark for Long Context Understanding https://arxiv.org/abs/2308.14508 2. 中国人名汉语拼音字母拼写规则 http://www.moe.g…

MAC OS安装Homebrew

文章目录 1.下载Homebrew2.完成安装3.验证安装4.更新 Homebrew作为一个包管理器&#xff0c;提供了一种简便的方式来安装、更新和卸载各种命令行工具和应用程序。相比于手动下载和编译源代码&#xff0c;或者从不同的网站下载安装包&#xff0c;使用Homebrew可以显著减少这些操…

飞算JavaAI:开辟 AI + 行业趋势的编程新范式

在当今数字化浪潮汹涌澎湃的时代&#xff0c;科技的快速发展正以前所未有的速度重塑着各个行业的面貌。人工智能&#xff08;AI&#xff09;作为其中最具变革性的力量之一&#xff0c;已经深入渗透到众多领域&#xff0c;从金融、医疗到制造业、教育等&#xff0c;无一不在经历…

Axure PR 9 动效 设计交互

大家好&#xff0c;我是大明同学。 这期内容&#xff0c;我们来用Axure制作一组动效。 动效 创建动效元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.选中画布&#xff0c;将画布填充颜色设置为蓝色(#0052D9)。 3.在元件库中拖出一个圆形元件&#xff0c;选中矩形元件&…

DeepSeek 本地部署

DeepSeek 本地部署 一、引言二、为什么选择本地部署 DeepSeek&#xff1f;三、具体步骤1.下载Ollama并安装&#xff08;Ollama 提供 API 支持&#xff09;2. 部署 deepseek-r12.下载Chatbox并配置为本地DeepSeek &#xff08;Chatbox 提供 UI 界面&#xff09; 一、引言 近期&…

网络工程师 (20)计算机网络的概念

一、定义 计算机网络是指将地理位置不同、具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路及通信设备连接起来&#xff0c;在网络操作系统、网络管理软件及网络通信协议的管理和协调下&#xff0c;实现信息传递和资源共享的计算机通信系统。 二、组成 资源子网&…

Unity UI Default Shader分析

文章目录 UI默认材质和Default ShaderShader的属性定义Mask组件支持RectMask2D组件支持其他支持使用Unity UGUI时经常有自定义shader的需求,虽然我们可以直接按照shader lab的规范写出shader,使用也没问题,但如果能让自定义shader符合UI shader的规范,支持Mask,Rect2DMask…

IEEE 802.3/802.2 | LLC / SNAP

注&#xff1a;本文为 “IEEE 802.3/802.2 | LLC / SNAP” 相关文章合辑。 未整理去重。 第三篇部分内容出自第二篇。 802.2 协议 haoay321 2010-01-28 20:52:02 LLC 协议 LLC&#xff08;Logic Link Control&#xff0c;逻辑链路控制&#xff09;是 IEEE 802.2 协议中规定…

【Linux】24.进程间通信(3)

文章目录 3.6 systemv共享内存3.6.1 共享内存函数3.6.3 一个简单的共享内存代码实现3.6.4 一个复杂的共享内存代码实现3.6.4 key和shmid的主要区别: 3.7 systemv消息队列&#xff08;了解&#xff09;3.8 systemv信号量&#xff08;了解&#xff09;进程互斥四个问题理解信号量…

【自然语言处理】TextRank 算法提取关键词(Python实现)

文章目录 前言PageRank 实现TextRank 简单版源码实现jieba工具包实现TextRank 前言 TextRank 算法是一种基于图的排序算法&#xff0c;主要用于文本处理中的关键词提取和文本摘要。它基于图中节点之间的关系来评估节点的重要性&#xff0c;类似于 Google 的 PageRank 算法。Tex…

如何评价镜头的好坏?光学镜头的一种评价标准

1光学传递函数MTF MTF是什么&#xff1f; 光学传递函数&#xff08;optical transfer function&#xff09;是指以空间频率为变量&#xff0c;表征成像过程中调制度和横向相移的相对变化的函数。光学传递函数是光学系统对空间频谱的滤波变换。一个非相干照明的光学成像系统&a…

openGauss 3.0 数据库在线实训课程1:学习数据库状态查看

openGauss数据库状态查看 前提 我正在参加21天养成好习惯| 第二届openGauss每日一练活动 课程详见&#xff1a;openGauss 3.0.0数据库在线实训课程 学习目标 学习从操作系统层面和使用openGauss工具查看数据库的状态、版本和数据文件目录。 课程作业 gs_ctl是openGauss提…

Stable Diffusion的入门介绍和使用教程

Stable Diffusion是一个文本到图像的潜在扩散模型&#xff0c;由CompVis、StabilityAI和LAION的研究人员和工程师创建。它使用来自LAION-5B数据库子集的512x512图像进行训练。使用这个模型&#xff0c;可以生成包括人脸在内的任何图像&#xff0c;因为有开源的预训练模型&#…

记一次框架利用接管学工系统

视频教程在我主页简介或专栏里 链接&#xff1a;观看更多 Springboot actuator &#xff08;1&#xff09;某学院学工管理系统存在Springboot actuator未授权,泄露了很多接口地址&#xff0c;其他接口就不过多介绍了&#xff0c;这里具体讲述这次利用到的httptrace和jolokia两…

低代码提升交付效率的公式计算

低&#xff08;无&#xff09;代码平台&#xff08;后统称“低代码”&#xff09;能够提升数字化应用建设、交付效率&#xff0c;已经成为IT从业人员的共识。目前&#xff0c;大部分CIO/CDO都能清晰定位和认知低代码的特点和作用。但仍然有人认为&#xff0c;使用了低代码工具软…

全程Kali linux---CTFshow misc入门(25-37)

第二十五题&#xff1a; 提示&#xff1a;flag在图片下面。 直接检查CRC&#xff0c;检测到错误&#xff0c;就直接暴力破解。 暴力破解CRC的python代码。 import binascii import struct def brute_force_ihdr_crc(filename): # 读取文件二进制数据 with open(filen…

Axure大屏可视化动态交互设计:解锁数据魅力,引领决策新风尚

可视化组件/模板预览&#xff1a;https://8dge09.axshare.com 一、大屏可视化技术概览 在数据驱动决策的时代&#xff0c;大屏可视化技术凭借直观、动态的展示方式&#xff0c;已成为众多行业提升管理效率和优化决策过程的关键工具。它能够将复杂的数据转化为易于理解的图形和…