C语言 杨辉三角 的打印

前两天做到一个很有意思的题昂,是有关杨辉三角的,题目要求是打印杨辉三角,在做题理解的过程中,我觉得还是十分有趣的,特别是在捋清思绪的那一瞬间醍醐灌顶的感觉,还是非常有成就感的,所以趁着今天,就给诸君分享分享

首先我们拿到一个题,我们的第一步骤当然是审题开始捋思路咯,如果你都不了解,甚至不知道杨辉三角是什么,拿何谈下手呢是吧

不懂怎么办,那就百度嘛,咱不懂咱还不会搜了嘛,我这里就直接给大家搬运过来了昂

咱们再往下翻,在度娘给我们罗列出来的众多“ 杨辉三角 ”的性质特点的里面,咱们可以提取出很重要的几个点,那就是

(1)每个数等于它上方两数之和

(2)每行数字左右对称,由1开始递增再递减

哎,这就是我们这道题所需要我们知道并运用的规律了,知道了这两点,我们就可以开始着手解题了昂

解题方法一

一.main函数

(1)首先咱们写出我们必不可少的主函数(main),然后我们定义一个整型 a,这个 a 是什么作用呢?它就是我们要求杨辉三角打印的行数,我们输入几,标准屏幕上的杨辉三角就打印几行

(2)提到输入,咱们的老朋友scanf函数又来了是不是

(3)再然后我们就调用我们打印杨辉三角的函数,我们就将其设置为YangHuiTriangle,之前就讲过了昂,这个函数自己可以随便定义的,帮助我们程序员自己理解代码的,所以诸君想取什么名字就写什么,随意随意昂,然后再传参,就是我们的“ a

二.函数——YangHuiTriangle

(1)因为我们不需要这个函数返回任何东西,所以设置为 void 类型,然后 int 类型接收 a

(2)拿到这个数字组成的三角形,我们要解题,自然就应该从我们C语言程序的角度出发思考问题是吧,我们得在数字规律和我们C语言程序中建立起联系。所以,经过再三思索啊,我们不难发现,我们可以将数字三角形看做我们的二维数组,这样一转换,诸君是不是一下就有一种豁然开朗的感觉呢?

(3)先定义两个数代表我们的“ 行 ”(x),“ 列 ”(y),再定义一个二维数组,我这里写的就是data [100] [100] ,这个时候就有小伙伴要问了,为啥是100呢?不能是其他数?可以!可以是其他数,唯一的要求就是,要大!什么叫大呢?你说这数字,写到多大才算大啊,“ 大 ”,“ 小 ”毕竟是一个相对概念,咱们这里的比较对象是谁呢?对了!那就是我们的“ a ”,我们这里的[100][100],仅仅只是对数组行列的一个大小限制,只要大于我们想要打印的行列,是不是就行了,是不是这么个理儿?所以,这个数字,诸君随意昂。

(4)由于杨辉三角第一行固定的有且仅有一个“ 1 ”,所以我们就直接int data[100][100] = { 1 };

(5)然后我们是不是就应该遍历我们的数组,往里放数字了是不?二维数组怎么遍历?咱们上期才讲了嘛,大声地告诉我:用 for 循环!

(6)开始遍历往里面放数字了,回到我们上面提取出的两点杨辉三角的特性,这又不是放在上面给鄙人装饰文章用的,咱得用起来啊是吧

每行的第一个数字都是1,那咱们就把所有的第一列都固定为1:data[x][0] = 1 ;

每个数等于它上方两个数字之和:data[x][y] = data[x-1][y] + data[x-1][y-1] ;

诸君自己捋一捋是不是这个理儿

(7)就这两个特点,咱们写出来,然后将它们分别放入 for 循环遍历的行列中,这是不是就完成了放数字到咱们的 “ 杨辉三角 ” 二维数组中去

(8)然后打印二维数组,无需多言,老熟人了昂,运用 for 循环去遍历打印

(9)最后这里介绍一个新朋友昂,我也是才认识——putchar()函数,这个函数大家可以理解为printf()函数的“ mini 版本 ”(反正我是这么觉得的昂,没毛病!),它的作用是输出打印一个字符,有且只能有一个字符大小。比如我这里的换行操作符—— \ n ,这就是一个字符嘛,所以可以用putchar()来进行打印操作。又因为是字符嘛,自然而然,我们就要使用单引号 ‘ ’ 咯 ,它的头文件也是include <stdio.h>,所以诸君放心使用即可

OK , 以上就是我们的全部代码,我们也就完成了我们杨辉三角的打印

那么这个时候就有小伙伴要问了,这看着挺唬人的,分开步骤来也就稀松平常嘛,有啥好稀奇的,哎,你看,你又急。让我觉得巧妙有趣的正是它的第二种解法

解题方法二

这第二种方法相当巧妙,运用了一种逆向思维,优化了我们第一代代码冗余的步骤

(1)main函数还是跟第一种一模一样的,我在这里就不过多赘述了

(2)仔细观察我们不难发现,除首行的只有一个 “ 1 ”,其它行的数都只跟它的上一行有所联系,而我们第一种解法是将每一行的数都先放入,再存储,再打印,这三个步骤是缺一不可的,既浪费我们程序检索的时间,又占用我们的内存空间

(3)所以我们就可以由此做出优化:填一行我们就打印一行,让空间复杂度从n^2降低到n

(4)我们想要填一行就打印一行,这就会出现一个问题:我们在填写每行数字的时候,如果按顺序填写会覆盖掉我们的上一个数据,因此我们就需要逆序填写(也就是每行的数字我们从最后一位的“ 1 ”开始填写)

(5)先直接打印我们第一行的“ 1 ”

(6)我们行的 for 循环大致不变,只是我们从第二行开始打印

(7)在列这个点上有较大的变化,我们需要逆序对其放入数字,所以我们的关于列的 for 循环条件变成了(y = x ; y > 0 ; y - - ),比较难思考的点就是data [y] += data [y-1] 

这个也就是data [y] = data [y] + data [y-1] 嘛,+= 这个运算符我们在往期有关操作运算符的知识点是讲过的,相信诸君都看得懂

难懂的点在哪里呢?就是这里等号前的data [y]表示的是该行的下标为 y 的列的数,而等号后的data [y] 和 data [y-1]都是指的上一行(x - 1)的下标为 y 和 y - 1 的列的数,能想通这一点,关于这个逆序输入的点,也就能轻松 get 到了

这里我建议大家画图理解,自己罗列出三四行的杨辉三角,然后按照这个行列的 for 循环带入推敲,往复几遍,应该就可以想通了,我就是这样子推敲通的,我比较笨昂,推算了老半天,诸君都是聪明人,我相信要不了几遍就能轻松搞定

(8)然后就是单行的打印,以及putchar的换行,这些上面都讲过了,我也就不在赘述了昂

这个代码我也上传到了我的码云里,大家感兴趣的话可以去看看:5.11_4/5.11_4/杨辉三角.cpp · 野原希之助/Dove_X - 码云 - 开源中国 (gitee.com)

OKK,以上就是这道打印杨辉三角的两种解法,当然了,肯定不止这两种啦,在我们后续学习到更深层次的一些函数时,肯定会有更优解。方法不止一种,正所谓条条大路通罗马,水流千里归大海嘛,好了,就这样,咱们下期再见。与诸君共勉!!!

  • 44
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值