- 博客(50)
- 收藏
- 关注
原创 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(C语言)
4月:3对(老兔子依然继续生,3月出生的兔子待满三个月才能生)以此类推,我们会发现,从3月份开始,兔子对数是前两月之和。5月:5对(老兔子依然继续生,3月出生的兔子可以生咯)3月:2对(满3个月可以生兔子啦)
2025-10-23 14:11:04
363
原创 打印楼梯(C语言)
本质上和九九乘法表是一个原理,用for循环嵌套的方式去实现,%c%c而不用%c是因为为了视觉上台阶的宽度更宽一些,没那么窄,而219在ASCII码中是表示一个方块。i表示行,j表示列,当i是第一行的时候,j也是一列,就是第一层台阶。i是2时,j是1,2,共两列台阶,循环的时候,要注意换行。
2025-10-23 13:45:33
159
原创 输出象棋棋盘(C语言)
8行,i代表行,j代表列,从0开始,所以i<8,j<8,而不是i<9。利用行+列数对2取余是否等于0来填写黑块或者白块。ASCII码中,黑块是219。
2025-10-22 16:11:20
179
原创 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?(C语言)
i表示该数,利用之间的联系,建立函数,x*x=i+100,y*y=i+168。分析:我们需要用到的是sqrt(开方),所以头文件需要补上math.h。可以设三个变量,i,x,y。
2025-10-16 16:15:06
152
原创 线性表(顺序表)的基本操作代码
线性表插入操作的ASL(平均移动次数)=n/2(每个的移动概率为1/n,每次移动是n-i+1,求和)删除操作的ASL=n-1/2(概率为1/n,移动是n-i,求和)
2025-09-04 14:29:20
349
原创 选择排序(原理+代码解析)
时间复杂度是O(n²)-----n*n,第一个for循环是循环了n次,但是嵌套里边对j的循环,不一定是n,所以n²是一个近似值。接着从下标为1(0+1)开始,固定数值8,找出后边最小数和8比较,我们发现,2比8小,所以2和8交换位置,数组更新为:0。用for循环对i进行遍历,然后从i+1开始,往后和i=0开始比较,以此类推,用了嵌套。然后从下标为1开始往后遍历,找出最小的数字和2进行比较,如果比2小,就交换位置。第一位数是2,我们先固定,放入数组下标为0,即a[0]=2。
2025-08-29 11:55:06
300
原创 C语言代码-排序组数
解析:我们对百位、十位和个位分别定义,然后因为是1234四个数字,我们利用循环嵌套的方法,去遍历数字,然后排除掉出现相同数字的三位数,再依次输出即可。主要是用一维数组,m表示数组下标,从0开始遍历个,i,j,k分别代表百位、十位和个位,要排除输入数字中有重复的情况。我们用动态内存分配的方式,记得排除内存分配失败的情况以及输入的个数小于3的情况。再思考,如果我们把题目。我们把题目再变一下,
2025-08-21 11:33:55
396
原创 散列表有关的知识点分析
元素是6个,表长是7(下标从0-6),我们对上述数据依次对7进行取余,21➗7=3余0,所以21放入0位置,23➗7=3余2,所以23放入2号位,以此类推,我们发现9取余之后也是2,但是2已经满了,这就是所谓的出现了冲突。例如:我们对上述数据元素对11进行取余,11和22对11取余均是0,11放入0号位,22就放入0号位的下一位,我们看到下标为①的,就是进行了一次操作,一次就找到位置,②的是两次操作。例2,我们是看数据元素中,数值最大的数,作为表长,数字是几,就放入下标为几的位置。
2025-08-20 11:59:15
1691
原创 平衡二叉树的调整
平衡二叉树的定义平衡二叉树(balanced binary tree),又称AVL树(Adelson-Velskii and Landis)。 一棵平衡二叉树或者是空树,或者是具有下列性质的二叉排序树:① 左子树与右子树的高度之差的绝对值小于等于1;② 左子树和右子树也是平衡二叉排序树。 为了方便起见,给每个结点附加一个数字,给出该结点左子树与右子树的高度差。这个数字称为结点的平衡因子(BF)。平衡因子 = 结点左子树的高度 - 结点右子树的高度根据平衡二叉树的定义,平衡二叉树上所有结点的平衡因子只能是-1
2025-08-18 18:11:13
736
原创 树表的查找-二叉排序树
比如我们要查找105:105先与根122比较,小于122,查左子树,与左子树的根99比较,大于99,查99的右子树,102小于110,查110的左子树,找到啦!插入40的时候,40和根45比较,小于45,插入左子树,和12比较,大于12,插入12的右子树,和37比较,大于37,插入37的右子树,操作完成。插入50的时候,50和45比较,大于45,插入45的右子树,和53比较,小于53,插入53的左子树,操作完成。(2)若其右子树非空,则右子树上所有结点的值均大于等于根结点的值;
2025-08-15 10:48:51
768
原创 查找-分块查找
这数字,我们先将38与索引比较,发现38>22,38<48,所以38一定只可能出现在块2,因为大于22,就是大于块1中最大的数了,所以不可能在块1,接着我们就在块2中进行顺序查找(这里不能二分查找,因为块内是无序的)中,索引表包含最大数字和所在的地址(下标),我们不难发现,块1的所有元素都比块2的小,块2的所有元素都比块3的小,但是块内是打乱顺序的(不是严格的单调增或者减)比如英语词典,我们按照A B C D.....Z按顺序划分,内部的单词,可以是无序的,但是A块的单词,首字母都是A。
2025-08-13 10:59:24
264
原创 查找-顺序查找&二分查找
比如查找21,mid=(1+11)/2=6,下标为6的数据是56,比21大,所以我们从前边开始继续找,此时high指针指向mid-1,也就是5,然后继续mid=(1+5)/2=3,21与下标为3的19比较,比19大,我们将low指针移到mid+1也就是4上,发现4的元素21与21相等,找到了!查找,就是给定一个关键字,我们去寻找库里面是否有相同的数据,返回其位置即可。我们根据查找的次数,一次作为根,两次的作为根6的子树,以此类推。而查找,我们今天学习两种,一种是顺序查找,一种是二分查找。
2025-08-12 15:52:48
654
原创 图的应用-关键路径(AOE网)
a4需要完成a1才能开始,所以a4的e等于6,以此类推,我们再分析一个,a7开始之前,可以先完成a1、a4或者a2、a5,权值之和较大的是6+1=7,所以a7的e填7。比如说B原料采购开始的时间是30分钟后,即A菜单制定结束可以开始,而C餐具准备,也是30分钟后可以开始,在A菜单制定完成即可开始。我们算到a11和a10(这两个活动均是汇点)的e和l均是14和16以后,往回算各活动的l值。a9需要a11的e减去a9的权值,即往前推4,所以是14-4=10,以此类推,不再赘述。——路径长度最长的路径。
2025-08-12 14:58:17
576
原创 图的应用--拓扑排序(AOV网)
例如下图,C1和C9我们可以直接学,不需要以什么为基础,而C2离散数学,学之前需要先学C1程序设计基础,看右图,C1和C9可以直接作为顶点,而所有需要将C1和C9作为先修课的,作为C1和C9的后继。,中间那个是无环的,所谓无环,就是比如V1顶点,如果没有任何路径能回到V1,就叫无环,也就是所有顶点都不能回到自身。我们不难发现,这三个点均有前驱,每个顶点也都有路径能回到自身,所以是有环的(有回路)2.接下来没有前驱的有C2、C4、C9,我们取C2,删除C2和C2所有出度边,然后删除C1和C1的所有出度,
2025-08-08 10:34:32
783
原创 图的应用-最短路径
3.接着,从V0和VO-V2出发,继续寻找最短路径,V0-V1依然不变是13,而V0-V2到V3,权值为8+5=13,除此之外无从V0/V2出发的路径能到达V3,所以V3的值改为13,V4没有V0-V2能直接到的边(就是走一条边就能到),所以依然是30不变,以此类推。下图中,比如由V0到V4的最短路径,有两条,一条是V0-V2-V3-V4=8+5+6=19,还有一条是V0直接到V4,权值是30,很明显19更小,所有19填入表中,以此类推,不再赘述。分析C到A,CBA,C没有直接到B的,所以不必改。
2025-08-07 11:23:14
1129
原创 图的应用之最小生成树(两个经典算法)
克鲁斯卡尔算法,我们也叫贪心算法,就是先把所有的顶点放入小房子里,然后把权值依此按从小到大的顺序排列,最小的权值边先进小房子,比如图中很明显V1-V3的边权值最小,所以把V1-V3的边先连上。接着我们继续,从V1和V3分别出发,所连接的边的权值进行比较,我们不难发现,V3-V6的权值是4,是最小的,就把V6也移入U中,以此类推,如下图(有点潦草)先把V1放进U中,然后我们观察,从V1发起的边,权值最小的是哪条,看图我们不难发现,是V1-V3这条边的权值最小,所以将V3放入U中。是如下,我们详细分析一下。
2025-08-05 15:50:50
330
原创 图的存储方式-无向图-邻接多重表
对于稀疏的无向图,我们采用邻接表的方式去存储,但是因为没有方向,一条边需要存储两次,有点浪费空间,所以我们引入邻接多重表的概念。还是自己找自己的方式,这里解释一下,比如V2,结点下标是1,我们去找1,而V4的下标是3,3自己去找3。依然采用自己找自己的方式(特别注意,该图不唯一,看你想怎么画,主要是为了美观)。从图中我们发现,v1有两条边连着v2和v4。
2025-08-04 17:04:40
484
原创 图的存储方式-十字链表
我们知道,用邻接表表示有向图的时候,不能直观的看出出度和入度是多少,邻接表可以直观的看出 出度,但是必须用逆邻接表,才能直观的看入度,所以我们引入了十字链表。邻接表和逆邻接表结合。
2025-08-04 16:55:15
309
原创 图的存储方式-邻接表
不难发现,我们把结点按顺序从0开始编号,看看他们分别接了哪个顶点的边,依次用指针表明即可,邻接表(链式)不唯一。分析一下:首先1结点的出度有两条,是到结点2和结点5,权值分别是80和64。接着从2结点开始,出度有两条,分别是到结点4和结点6,以此类推。如果给你以下图,已知某网(带权值),画出该网络。
2025-08-04 16:35:15
303
原创 计组-除法运算(电路)
① 机器不能“心算”上商,必须通过比较被除数(或余数)和不断右移的除数的大小来确定商值,若差为正(够减)上商1,差为负(不够减)上商0。的,而要求机器把每位商直接写到寄存器的不同位也是不可取的。(文中红色箭头处),最终得到的结果,余数是0.0111,需要乘以2的-4次方,也就是除以2的4次方,即右移4位,得到。我们得到的商是0.1101,首位0会先进入寄存器,然后1进入的时候,0往前移一位,1进入,以此类推。② 除数不断右移后,其位数越来越多,可能会超过ALU的位数。除法运算中,n位÷n位,
2025-08-01 10:05:42
661
原创 图的存储结构-邻接矩阵
以此类推,V3和V2,V4、V5都有边,依次填1,V4和V1、V3、V5右边,依次填1,V5和V2、V3、V4右边,依次填1。,比如V2的入度为1,出度为0,所以V2的度为1,V2所在行1的个数为0,所在列1的个数为1,0+1=1(得证)我们建立一个邻接矩阵,我们发现,V1和V2,V4均有边,所以填上1,其余填0。V2和V1,V3,V5都有边,所以分别填上1,其余填0。图的邻接矩阵是一个二维数组,A.arcs[n][n](记录各个顶点信息)和一个。(表示各个顶点之间关系)第i行(列)中1的个数。
2025-07-30 11:19:41
636
原创 乘法运算电路原理
(这里我想用没那么专业的话术跟大家说一下,ACC的右移,其实就是把Cout的值推过来,作为首位,然后ACC的数值一次往后移一位,比如cout=0,ACC=1101,ACC右移,把Cout的值作为ACC的首位,就是0110(最后一位1移除))Y=0.1011,小数点后第一位是2的-1次方,第二位是2的-2次方,第三位是2的-3次方,第四位是2的-4次方。取决于位数,如果位数是4,初始值就是Cn=4,每执行一次,减一,比如下一次就是Cn=3。第五步:Cn=2,此时,Y==0,直接整体右移,ACC的值为。
2025-07-30 10:38:16
488
原创 数据结构-图的相关定义
上图中,左图是连通图,我们不难发现,任取两个顶点,他们之间是有路径可以连接的,比如V0到V2,可以是V0-->V1-->V2的路径。下图很明显是一个非强连通图,因为V1到不了V0,但是如果把V1单独拿开,把V0.V2,V3构成的强连通图也单独拿开,就会变成图二。意思是:该子图是G的强连通子图,将D的任何不在该子图中的顶点加入,子图不再是强连通的。图可以没有边,只有一个顶点也叫图,但是单独的一条边,或者一个顶点连一条边,不能叫图。该子图是G 的连通子图,在该子图中删除任何一条边,子图不再连通。
2025-07-29 16:22:57
575
原创 计组--移位运算
分析一下我们可以知道,x/2的机器数是x的机器数右移得到的结果,而2x的机器数是x的机器数左移得到的结果。整体右移,低位移出,高位补同符号位(原本是负数1,补1,原本是非负数0,补0)我们不禁思考,移位运算的意义在哪?x/2的机器数:0010 0000 0000 0100B。2x的机器数:1000 0000 0001 0000B。x的机器数:0100 0000 0000 1000B。整体左移,高位移出,低位补0。整体右移,低位移出,高位补0。整体左移,高位移出,低位补0。x/2的真值是8196。
2025-07-29 15:11:53
529
原创 半加器和全加器以及定点数的加减法运算
如下图:A和B输入时,我们发现,B有两条路径可供选择,这个通过Sub的值来判断,如果Sub=0,做加法,走左边的路,反之走右边,做减法,图中\n表示的意思是数据是多位数,不止一位。这里有一点需要注意,如果计算A-B的补码,其中A,B均为正数,我们可以转换成A+(-B)的补码,而B的补码--> -B的补码,只需要包含符号位,按位取反,再+1即可。B的右边路径表示减法,有一个非运算器,表示取反,其实就是B做减法的时候,取反,然后sub=1,取反后+1,这个过程很熟悉吧,其实就是。
2025-07-29 09:35:44
548
原创 哈夫曼树的解析
我们再详细解释一下吧,首先构造哈夫曼树,C和S对应的权最小,先构成一个小树4,以此类推,构成哈夫曼树,然后依次编号后,从上至下读取,比如T,是14->6->3这条路径,也就是00。接着,继续分析,下标为12的数组中,双亲是13,我们来到下标为13的位置,发现12是13的右分支,记为1,录入一维数组下标为3的窗口,到此结束,所以。C在下标为3的位置里,双亲在下标为11的数组,我们发现,3就存在下标为11的右分支里,记为1,一维数组中下标为5的位置,我们填上1。:树中所有叶子结点的带权路径长度之和。
2025-07-28 17:47:52
1336
原创 计组-常见的逻辑运算和运算电路
A|B=Y或者A+B=Y的表达式,有1则1,全0则0。1异或1=0,0异或0=0,1异或0=1,0异或1=1。:与运算后取非,比如A·B=1,再做非运算,结果是0。:也叫取反运算,用“~”表示,也可以这样表示。:A·B或者A&B表示,全1则1,有0则0。,A的上方加一个横线,表示对A做非运算。
2025-07-28 16:02:57
329
原创 树的遍历和森林的遍历
中序遍历是先遍历第一棵树的子树,然后再遍历第一棵树的根节点,接着遍历第二棵树的子树,根节点...后根遍历,就是先遍历子树,再遍历根,A是根,所以遍历它的子树B C D。接着遍历子树,分别是B C E,根B遍历完,无子树,所以是(A B)先遍历第一棵树的根,然后遍历第一棵树的子树,接着依次遍历其他树。B遍历完,遍历C,先遍历C的子树D,最后遍历E,再回到根A。遍历C,C遍历完遍历C 的子树,所以是(A B C D)所以是BEF,第二棵树,是C,第三棵树是DGHIJK。,顾名思义,先遍历根,再遍历子树。
2025-07-25 15:55:14
331
原创 树和二叉树的转换,森林和二叉树的转换
把左子树的右孩子的右孩子的右孩子的。右孩子,全部与该左子树的双亲连线,如图,B的右孩子是C,还有一个右孩子的D,将C和D都与A连线,左子树E的右孩子F、G与E的双亲B连线,左子树H的右孩子I与E的双亲D连线。(这里有一个协助记忆的方法,二叉树之所以叫二叉树,是因为分了左右孩子,而树可能不止左右孩子,所以对于树,我们倾向于指向兄弟,二叉树指向右孩子)B和E、H都是左孩子,所以不用动线,CD是A的非左孩,所以跟A的连线要抹去,同理,FG和B的线要抹去,I和D的线要抹去。将根节点的右孩子,的右孩子,的右孩子。
2025-07-25 15:42:20
702
原创 不同字长整数之间的转换
对于负数,我们需要填充的是1,16位到32位的转换,是32-16=16,16/4=4,所以是1111 1111 1111 1111(十六进制),也就是FFFF,所以答案是B。首位是0,也就是0000,是正数,正数是填充0,32-16=16,16/4=4,所以是0000 0000 0000 0000(十六进制),也就是0000,所以选A。依然先分析首位,9是1001,首位是1,为负数,16-8=8,8/4=2,所以是1111 1111,也就是FF,所以答案是B。首先需要分析符号位,注意看,是补码。
2025-07-25 14:22:07
332
原创 树的存储方式
我们分析一下这张图,R的第一个孩子是A,所以左边的指针指向A,而R没有兄弟,所以右边为空,A的第一个孩子是D,兄弟是B,D没有孩子,左边为空,有兄弟E,所以右边指向E,一次类推。我们不难发现,A后边的0是代表A的双亲是R(R所在位置是0,所以A后边标记0)。D的双亲是1,说明在1号位,是A,我们可以对比树图核对。fc表示第一个孩子,我们发现,R的三个孩子是ABC,所以指向的是123,F的孩子是GHK,所以指向的是789。双亲域:指示本结点的双亲结点在数组的位置。数据域:存放结点本身信息。
2025-07-24 11:44:08
424
原创 二维数组存储相关计算(纯技巧)
技巧,将两个数组下标按上下写好,如果是按行,是左手准则,如果是按列,是右手准则。如果是下标为0开始,正常计算,如果是下标为1,下边的要分别减1。
2025-07-23 11:33:49
487
原创 二叉树的相关公式和讲解
分析:二叉树的结点个数只可能是0,1,2n=n0+n1+n2n0:度为 0 的结点数(叶子)n1:度为 1 的结点数n2:度为 2 的结点数。
2025-07-22 17:17:58
716
原创 浅谈原码和补码
由于寄存器最高只能存4位,图中是5位了,所以最高位会丢失,即为0010=2,但是正确的结果应该是等于0,所以我们可以发现,原码中如果包含了负数,很难直接相加减,我们必须通过取绝对值,判断绝对值大小的情况去计算,由此为了便于计算,我们引入了补码。-5的补码是:先写出-5的原码:10000101,然后符号位不变,即首位1不变,剩下的按位取反,即0变成1,1变成0,为1111 1010+1=1111 1011。原码,是由一串01序列构成,首位代表符号位,0为正,1为负。最高位舍弃,所以是0000,答案正确啦~
2025-07-21 15:28:07
401
2
原创 二叉树遍历方法
D为B的左子树,遍历到D,D为根,左右子树为空,根据 根左右顺序,是BDE(ABDE)先看左子树,A的左子树是B,B的左子树是D,所以从D开始,左右根顺序,是。先看左子树,B为A的左子树,D为B的左子树,根据左右根顺序,先是。再看右子树,C是F的根,G是F的左子树,F的右子树为空,所以是。F为根,G为左子树,右子树为空,所以是FG(ABDCFG)再看右子树,F是G的根,G是F的左子树,顺序是GF,所以。,然后再遍历左子树,左子树依然用根左右的顺序遍历(A)最后,根据左右根顺序,最后来到根A,
2025-07-21 15:00:52
473
原创 数据结构DAY6-KMP算法
KMP算法关键点是,不要回溯!一旦回溯,就是BF算法,涉及两个概念,next[i]和nextval(优化版next)我们取匹配数最多的,也就是三位匹配,将子串移动到第三位,以此类推依次比较,这个过程叫KMP算法。而nextval又该如何判断呢?依然默认第一个是0,以下是分析。
2025-07-16 17:40:20
268
原创 计组DAY6-进制数的转换
第二个三位:1*1+0*2+1*4=5。第三个三位:1*1+0*2+1*4=5。我们看到小数部分,是010,对应的是2的2次方,2的1次方,2的0次方,计算结果为:2。关键在于依次整数部分除以2,取余,并取倒序,小数部分乘以2,取整数部分,正序。如果是八进制,则从右往左,依次是8的0次方,8的1次方.....,整数部分:从右往左,第一个三位:0*1+1*2+0*4=2。十六进制:包含0 ~ 9,A ~F(后缀H,前缀ox)从右往左,依次是2的0次方,2的1次方...以此类推,十六进制是一样的,不再解释。
2025-07-16 14:45:24
485
原创 数据结构DAY5-串的定义
我们需要非常清楚,两个串相等的前提一定是,字符数一样,字符值一样,并且从第一个字符开始比较。比如S1='abcd'和S2='zfg'比较,很明显,S1>S2。串(String):由零个或多个字符组成的有限序列。(8)子串在串的位置:子串第一个字符在串中的位置。(6)子串:串中任意个连续的字符组成的子序列。(5)空格串:由一个或多个空格组成的串。(7)字符在串的位置:字符在串中的序号。S2在S3的位置是6,在S4的位置是7。(3)长度:串中字符的数目。这里举一些例子帮助大家理解。
2025-07-15 16:04:22
225
原创 计组DAY5-与存储器相关的性能指标
情景说明:准备访问某个存储单元的数据时,我们需要先将地址存在MAR中,随后译码电路会根据MAR中的地址选中该存储单元, 然后将数据传给MDR。每个存储单元能存储8位二进制数,则为1B,所以10位二进制数的存储容量大小为1KB=1024B=1024*8Bit。存储容量大小有K(次) M(百万次-10^6) G(十亿次-10^9) T(万亿次-10^12)(主频:1s内的时钟周期数,CPI:一条指令所需要的时钟周期数)n=1(即1个二进制数) 有0或者1两种--->2的1次方种。
2025-07-15 15:08:12
233
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅