C语言学习—杨辉三角的实现

article/2025/9/20 20:20:22

文章目录

  • 前言
  • 一、用二维数组实现杨辉三角
  • 二、用一维数组实现杨辉三角
    • 1.用两个一维数组实现杨辉三角
    • 2.用一个一维数组实现杨辉三角
  • 三、不用数组实现杨辉三角
  • 总结


前言

杨辉三角,是二项式系数在三角形中的一种几何排列。如下图所示,
在这里插入图片描述
杨辉三角是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。
本文将通过以下几个方面来实现杨辉三角:
1.用二维数组实现杨辉三角;
2.用一维数组实现杨辉三角;
2.1用两个一维数组实现杨辉三角;
2.2用一个一维数组实现杨辉三角;
3.不使用数组实现杨辉三角(使用for循环实现)


一、用二维数组实现杨辉三角

使用二维数组实现杨辉三角,也就是说,将杨辉三角看成是二维数组,有对应的行数和列数,例如,第1行第1列代表数1,第5行第2列代表4,如下图所示。
在这里插入图片描述
这里我们使用动态内存去申请二维数组,而二维数组可以看作是竖向的指针数组去指向横向的一维数组:
在这里插入图片描述
具体的实现过程如下代码所示:

void YangHui2(const int n) //利用二维数组去实现杨辉三角
{//二维数组可以看作是竖向的指针数组去指向横向的一维数组int** p = (int**)malloc(n * sizeof(int*));  //先申请竖的指针for (int i = 0; i < n; i++) //再用竖的指针去指向横向的数组{p[i] = (int*)malloc(n * sizeof(int));}assert(p != NULL);  //断言for (int i = 0; i < n; i++){for (int j = 0; j <= i; j++){//特殊处理,防止数组越界if (j == 0 || i == j)  //每一行的第一个值和最后一个值均为1{p[i][j] = 1;}else  //其他的均是公式:当前值 = 上一行本列的值 + 上一行上一列的值{p[i][j] = p[i - 1][j] + p[i - 1][j - 1];  //此处不需要考虑数组越界问题,因为越界问题已经特殊处理}}}for (int i = 0; i < n; i++){for (int j = 0; j <= i; j++){printf("%-5d", p[i][j]);  //打印杨辉三角}printf("\n");}for (int i = 0; i < n; i++){free(p[i]);//用malloc,一定要释放}free(p); //利用malloc后,释放指针p
}

这里打印10行杨辉三角,运行结果如下:(如果想要打印等腰三角形形式的,可自行细调输出格式,这里对格式不作要求)
在这里插入图片描述

二、用一维数组实现杨辉三角

1.用两个一维数组实现杨辉三角

此过程利用两个一维数组arr[]和brr[],利用一个数组arr[]按照杨辉三角的规律进行下一行的计算,计算的值保存在另一个数组brr[]中,最后再将brr[]的值赋给数组arr[],打印arr[]即可。
注意一点的就是初始将数组arr[]和brr[]的值全部赋值为1,这样方便计算。

具体的实现过程如下代码所示:

void YangHui1_2(const int n)  //一维数组实现杨辉三角(用两个一维数组)
{int* arr = (int*)malloc(n * sizeof(int));int* brr = (int*)malloc(n * sizeof(int));  //申请brr是为了存放arr中计算的值,最后再将值赋给arr即可assert(arr != NULL && brr != NULL); //断言指针不为空for (int i = 0; i < n; i++)  //将arr和brr的值全部赋值为1{arr[i] = 1;  //将数组arr的值全部赋为1,是为了便于对数组进行操作brr[i] = 1;  //将数组brr的值全部赋为1,是为了便于对数组进行操作}for (int i = 0; i < n; i++)  //外层循环处理第i行的数据{//这里内层j是从1开始,也就是第一列(j==0)不需要处理,因为都是1for (int j = 1; j < i; j++)  //内部循环处理每一层的数据{//这里不需要考虑数组越界问题,由于列数j是从第2列开始的,所以不存在越界问题//利用公式不会超出第一列,最多到第一列,也就是brr[1] = arr[1] + arr[0];brr[j] = arr[j] + arr[j - 1]; //利用公式处理完每一层的数据,存放在brr中}//以下利用for循环将brr的值重新赋给arr,并打印arrfor (int k = 0; k <= i; k++){arr[k] = brr[k];  //将计算的值再重新赋给arrprintf("%-5d", arr[k]);  //打印arr}printf("\n");}free(arr);  //利用malloc后,要进行释放free(brr);
}

这里打印10行杨辉三角,运行结果如下:
在这里插入图片描述

2.用一个一维数组实现杨辉三角

利用一个一维数组,此方法是一维数组的第一个值赋值为1,剩余赋值为0,然后从后向前按照杨辉三角的规律推断前面的值。
这里需要注意边界、特殊值的处理,防止数组越界。

具体的实现过程如下代码所示:

void YangHui1_1(const int n)  //一维数组实现杨辉三角(只用一个一维数组)
{//int* arr = (int*)malloc(n * sizeof(int));  //动态申请一个一维数组arr//利用calloc动态申请n*sizeof(int)大小空间之后,会将里面的值全部初始化为0int* arr = (int*)calloc(n, sizeof(int));  //注意此处为什么要用calloc,而不用malloc/*【注】此处用calloc,注意calloc和malloc的区别calloc:在内存的动态存储区中分配n个长度为sizeof(int)的连续空间,不同点:calloc在动态分配完内存后,自动初始化该内存空间为【零】,而malloc不初始化,里边数据是随机的垃圾数据*/assert(arr != NULL);  //断言arr[0] = 1;  //将数组的第一个值赋值为1for (int i = 0; i < n; i++)  //此层循环是处理第i行的数据,也就是控制层数{//此方法是一维数组的第一个值赋值为1,剩余赋值为0,然后从后向前推for (int j = i; j >= 1; j--){//若从后向前处理,当i=0时,不需要处理(循环进不去),当i=1时,也就是第2行,只需处理一个值/*1  0  0  0  0  0  0  0  01  1  0  0  0  0  0  0  01  2  1  0  0  0  0  0  01  3  3  1  0  0  0  0  0*///第一列不需要处理,从后向前,也即j>=1是退出条件arr[j] = arr[j] + arr[j - 1];  //当前值 == 当前值(初始均为0)+ 上一个位置的值}for (int k = 0; k <= i; k++)  //小于等于i是因为第i行只需要打印i个值{printf("%-5d", arr[k]);}printf("\n");}free(arr);  //利用malloc后,要释放指针arr
}

这里打印10行杨辉三角,运行结果如下:
在这里插入图片描述

三、不用数组实现杨辉三角

不用数组实现杨辉三角,这里利用for循环实现:
第一个数是1;
第二个数是:1*(n - 1)/1;
第三个数是:1*(n - 1)/1 * (n - 2 )/2;
第四个数是:1*(n - 1)/1 * (n - 2 )/2 * (n - 3)/3
根据规律得到计算公式:tmp = tmp * (i - (j - 1))/(j - 1); //用到上一个值*(i - (j - 1))/(j - 1)

具体的实现过程如下代码所示:

int YangHui(const int n)  //不用数组实现杨辉三角,利用for循环直接实现杨辉三角
{//第n行:第一个数是1;第二个数是:1*(n - 1)/1;第三个数是:1*(n - 1)/1 * (n - 2 )/2;//		 第四个数是:1*(n - 1)/1 * (n - 2 )/2 * (n - 3)/3//tmp = tmp * (i - (j - 1))/(j - 1); //用到上一个值*(i - (j - 1))/(j - 1)if (n < 0){return -1;}int tmp = 0;  //先申请一个变量tmpfor (int i = 1; i <= n; i++)  //此处是从第一行开始,处理每一层的数据{for (int j = 1; j <= i; j++)  //注意此处是从下标1开始的,也就是第一列的列下标均为1{if (j == 1)  //每一行的第一个值特殊处理,其它的值均用公式,从后向前推导{tmp = 1;  //第一列的值均为1,第一列作为特殊列处理}else{tmp = tmp * (i - (j - 1)) / (j - 1);  //公式}printf("%-5d", tmp);}printf("\n");}
}

这里打印10行杨辉三角,运行结果如下:
在这里插入图片描述


总结

以上就是利用4种方法实现杨辉三角,杨辉三角在编程中较为容易实现。

http://chatgpt.dhexx.cn/article/9HNk6ael.shtml

相关文章

C语言——杨辉三角(最佳算法)

目录 方法一&#xff1a;一维数组&#xff0c;节约内存 方法二&#xff1a;&#xff08;最佳算法⭐&#xff09;递归函数法&#xff0c;程序最简&#xff0c;占用内存最少 运行结果&#xff1a; C语言输出杨辉三角形 等腰三角形 前言 杨辉三角形的特点&#xff1a; 第一列…

【C语言】四种方式使用C语言输出杨辉三角前10行

杨辉三角第一列和对角线为1&#xff0c;其他的计算公式为 a[i][j]a[i-1][j-1]a[i-1][j] 实现杨辉三角输出有多种方式&#xff0c;本文提供其中的四种实现方式。 方式一 #include "stdio.h" int main() {int a[10][10] {0};int i,j;for(i0; i<10; i){a[i][i]1;a…

【C语言】输出杨辉三角形 - 杨辉直角三角形(杨辉三角最佳算法) 输出杨辉三角前十行

C语言输出杨辉三角形 直角三角形 前言 如下可看出杨辉三角形的特点&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 * * * * * *&#xff08;1&#xff09;第一列和对角线上的元素都为1&#xff1b; &#xff08;2&#xff09;除第一列和对角线上的元素之外…

Maven的安装步骤(保姆级安装教程)

一、安装本地Maven 选择你需要的maven版本下载&#xff1a;官网下载传送门 我使用的是3.6.1版本&#xff1a;maven-3.6.1-bin.zip 二、安装 把下载好的maven压缩包解压到一个没有中文&#xff0c;空格或其他特殊字符的文件夹&#xff0c;如&#xff1a; 三、配置环境变量…

Maven安装教程讲解

目录 一、下载安装JDK二、下载 Maven三、配置 Maven 环境变量四、配置 Maven 仓库地址五、配置 Maven 镜像六、配置 Maven JDK七、IDE配置 Maven八、IDE新建 Maven 项目九、IDE执行 Maven 命令 一、下载安装JDK 教程&#xff1a;https://blog.csdn.net/weixin_43888891/articl…

Maven下载及安装教程详解

进入Maven官网的下载页面&#xff1a;http://maven.apache.org/download.cgi#&#xff0c;如下图所示&#xff1a; 选择当前最新版本&#xff1a;"apache-maven-3.3.9-bin.zip"&#xff0c;下载到本地&#xff0c;解压缩到本地磁盘下。 --bin&#xff1a;保存Maven的…

Maven安装配置详细教程

文章目录 写在前面Maven下载安装配置环境变量配置settings.xmleclipse创建示例 写在前面 你还在为导入jar包而苦恼吗&#xff1f;常常找不到jar包&#xff0c;不知道从哪导入&#xff0c;就算导入了可能还会依赖冲突&#xff0c;目录杂乱&#xff0c;那么maven你值得拥有。 什么…

Maven官网下载安装详细教程

1、下载安装Maven 第一步 百度搜索Maven&#xff0c;进入官网 第二步 在右侧选择Download 第三步 进入Download页面&#xff0c;选择第三个下载 第四步 下载后解压&#xff0c;接着是配置环境 2、配置环境变量 M2_HOME Maven目录下的bin目录 MAVEN_HOME Maven目录 在系统…

Win系统下如何安装Maven教程

本文须知&#xff1a;安装maven环境之前要先安装java jdk环境&#xff08;没有安装java环境的可以先去看安装JAVA环境的教程&#xff09;Maven 3.3 require JDK 1.7 及以上。 第一步&#xff1a;下载maven&#xff08;本教程安装的是3.6.3&#xff09; 官方下载链接&#xff1a…

Maven的安装与配置教程(图文)

文章内容 一、Maven的下载二、Maven的本地安装三、Maven基础配置四、Idea配置Maven 一、Maven的下载 选择要下载的maven版本&#xff1a;官方地址传送门 二、Maven的本地安装 下载好后解压到电脑D盘目录下&#xff08;注&#xff1a;不要有中文目录和尽量别安装在c盘下&am…

Maven最新版的下载与安装教程(详细教程)

前言 本篇文章是基于win10系统下载安装Maven的教程。 一、下载Maven 进入Maven官网&#xff1a;https://maven.apache.org/download.cgi 选择 .zip文件下载&#xff0c;最新版本是3.8.5 二、安装Maven 1.解压 .zip文件 将 .zip文件解压到没有中文没有空格的路径下。例如…

非常详细的Maven安装与配置教程

Maven的安装与配置 1. 下载Maven2. 解压压缩包3. 添加 M2_HOME 和 MAVEN_HOME4. 添加到环境变量 - PATH路径下5. 验证Maven是否成功安装6. 修改本地仓库位置7. 添加Maven阿里云仓库&#xff0c;设置jdk版本为1.88. 在IDEA中修改Maven的地址9. 附录: setting.xml文件作为参考 1.…

Maven的安装与配置

1、在Windows上安装Maven 1.1 检查JDK安装 在安装Maven之前&#xff0c;首先要确认已经正确安装了JDK。Maven可以运行在JDK1.4及以上的版本上。打开Windows的命令行&#xff0c;运行如下的命令来检查Java安装情况&#xff1a; C:\Users\panjunbiao>echo %Java_Home% C:\U…

maven的下载与安装教程(超详细)

前言 本篇文章是基于win10系统下载安装Maven的教程。 一、 Maven介绍 1. 什么是Maven Maven是一个跨平台的项目管理工具。作为Apache组织的一个颇为成功的开源项目&#xff0c;其主要服务于基于Java平台的项目创建&#xff0c;依赖管理和项目信息管理。maven是Apache的顶级…

maven安装教程(超详细图解)

&#x1f4d6;本篇超级详细案例图解教学 Maven安装教程&#xff0c;图片点击可放大仔细看 Maven安装教程 1、前提 Maven需要Java环境,所以首先需要安装JDK,本教程默认已安装JDK1.8 2.解压文件 将maven文件夹复制到磁盘目录&#xff0c;本教程以安装到D:\maven目录为例 3.…

史上最详细的Maven安装教程

熟练的配置开发环境是每一个程序员必备的功课&#xff0c;俗话说&#xff1a;工欲善其事&#xff0c;必先利其器。 本文须知&#xff1a;安装maven环境之前要先安装java jdk环境&#xff08;没有安装java环境的可以先去看安装JAVA环境的教程&#xff09;Maven 3.3 require JDK …

elasticsearch(es)查询api,结果集排序/分页/范围查询;es查询某个字段不为null且不为空;分组聚合distinct

查询某个字段不等于空字符串,must_not反向查找&#xff0c;不等于匹配值的结果集 查询某个字段的值不等于空字符串 GET aunt/aunt_type/_search {"query": {"bool": {"must_not": [{"term": {"auntUserId": {"value&…

ElasticSearch系列(四)--springboot使用ElasticsearchRestTemplate整合ElasticSearch,实现文本高亮检索

前言 ElasticsearchRestTemplate是spring-data-elasticsearch项目中的一个类&#xff0c;和其他spring项目中的template类似。 网上的学习资料大都是基于ElasticsearchTemplate,但是ElasticsearchTemplate在未来的版本会被废除 预备知识 - 建立索引 因为是基于springboot,那就…

springBoot集成es(三)spring-data集成es与常用查询操作

接着上一篇博客&#xff0c;看下spring-data集成es的常用查询操作&#xff08;这里只写serviceImpl部分代码&#xff09;&#xff1a;ElasticsearchRepository使用QueryBuilder构造查询条件 &#xff1a;Iterable<T> search(QueryBuilder var1); 官网介绍&#xff1a;ht…

es的must_not的踩坑

文章目录 前言一、需求背景二、坑2.1 坑一2.2 坑二 总结 前言 记录下在公司做需求时must_not踩的坑 一、需求背景 要去做人才库的一个排除项&#xff1a;排除x个月面试不通过。实际上的dsl语句则对应的是must_not。且内部要包含两个元素&#xff1a;x个月、面试不通过&#x…