数据结构与算法
文章平均质量分 88
凌空的桨
https://github.com/marsmarcin/
展开
-
大整数乘法
大整数乘法【分析】一般情况下,求两个大整数相乘往往利用分治法解决,理解起来较为困难,这里我们使用的方法是模拟人类大脑计算两个整数相乘的方式进行求解大整数相乘,中间结果和最后结果仍然使用数组来存储。假设A为被乘数,B为乘数,分别从A和B的最低位开始,将B的最低位分别与A的个位数依次相乘,乘积的最低位存放在数组元素a[门]中,高位(进位)存放在临时变量d中;再将B的次低位与A的个位数相乘,...原创 2020-02-03 19:19:17 · 4081 阅读 · 3 评论 -
求算数表达式的值
编写算法,要求在键盘上输入一个算术表达式6+(7-1)*3+10/2, 输出表达式的值。【分析】表达式求值是栈的典型应用,计算机在求算术表达式的值分为两步:(1)将中缀表达式转换为后缀表达式; (2) 依据后缀表达式计算表达式的值。6+(7-1)*3+10/2的后缀表达式为671-3*+ 102/+,后缀表达式中不存在括号,并且操作数顺序保持不变,每输出两个操作数,输出一一个运算符,...原创 2020-02-03 19:11:03 · 2106 阅读 · 2 评论 -
一年中的第几天
根据输入的年月日,计算它是这一年的第几天【分析】根据输入的年(year)、月(month)、日(day),首先根据年份判断这一年是闰年还是平年,如果是闰年,则2月时29天,否则2月为28天,然后累加前month-1个月的天数,最后加上day就是这一年的第几天。code:#include <stdio.h>#include <iostream>const ...原创 2020-02-03 19:03:43 · 2608 阅读 · 0 评论 -
高位数的幂运算
计算7的34次方【分析】计算-一个数的n次方可通过简单的一重循环实现,但7的34次方是一个非常大的数,它超过了计算机的表示范围。这其实是一-个大整数存储问题,可以利用数组来存储。要计算7的34次方,将1存储在数组a中,不断地将其与7相乘,循环34次,数组a的值就是7的34次方。任何一个整数(假设位数为n)与7相乘,结果的位数不会超过n+1。 从最低位到最高位,依次将每位数与7相乘,如果...原创 2020-02-03 18:57:47 · 649 阅读 · 0 评论 -
大小写金额转换
大小写金额转换在实际工作中,当我们填写人民币数据时,比如报销差旅费、打欠条,就需要使用大写金额书写,有时候需要把一系列表格中的小写金额转换为大写,这就是大小写金额转换,例如,10 802.54的大写金额为:壹万零捌仟元伍角肆分。【分析】将小写金额转换为大写金额的方法如下。(1)求出小写金额对应的整数位数和小数位数。(2)分别将整数部分和小数部分转换为大写金额,即把阿拉伯数字“01234...原创 2020-02-03 18:37:32 · 2384 阅读 · 0 评论 -
回溯算法3——装箱问题
有n个集装箱要装到两艘船上,每艘船的容载量分别为cl, c2,第i个集装箱的重量为w[i], 同时满足: w[]+w[2)+.+w[n]<=c1+c2; 确定一个最佳的方案把这些集装箱装入这两艘船上。【分析】最佳方案的方法:首先将第一艘船尽量装满,再把剩下的装在第二艘船上。第一艘船尽量装满,等价于从n个集装箱选取一一个子集,使得该子集的问题解空间: (x1, x2, x3, . xn),...原创 2020-02-03 15:12:04 · 2310 阅读 · 0 评论 -
回溯算法2——填字游戏
在3x3的方格中填入数字1~N(N>0)中的某9个数字,每个方格填1个整数,使相邻的两个方格中的整数之和为质数。求满足以上要求的各种数字填法。【分析】利用试探法找到问题的解,即从第一一个方格开始, 为当前方格寻找一个合理的整数填入,并在当前位置正确填入后,为下一方格寻找可填入的合理整数。如果不能为当前方格找到一个合理的可填整数,就要回退到前一方格,调整前一方格的填入数。当第9个方格也填入...原创 2020-02-03 15:00:46 · 4118 阅读 · 3 评论 -
回溯算法1——组合问题
【问题】找出从自然数1~n中任取r个数的所有组合。例如n=5,r=3的所有组合如下:(1)1,2,3(2)1,2,4(3)1,2,5(4)1,3,4(5)1,3,5(6)1,4,5(7)2,3,4(8)2,3,5(9)2,4,5(10)3,4,5按照回溯法的思想,将找到的组合以从小到大的顺序存放到数组a[0],a[1], . a[r-1]中,组合中的元素满足以下性质:(...原创 2020-02-03 14:51:30 · 2438 阅读 · 1 评论 -
贪心算法3——加油站问题
【问题】一辆汽车 加满油后可以行使n千米。旅途中有若干个加油站,途加油次数减少,设计一个算法,输出最好的加油方案。例如,假设沿途有9个加油站,总路程为100千米,加满油后汽车的最远距离为20千米。汽车加油的位置如图所示。【分析】为了使汽车在途中加油次数减少,需要让汽车加过一次油 后行使的路程尽可能的远,然后再加下一次油。按照这种设计思想,制定以下贪心选择策略:(1)第1次汽车...原创 2020-02-03 12:32:30 · 4885 阅读 · 0 评论 -
贪心算法2——哈夫曼编码
【构造哈夫曼树】假设有n个叶子结点,对应的权值分别是w1、w2、....,wn则哈夫曼树的构造如下:(1)将w1,w2,....wn看成是有n课树的森林(每棵树仅有一个结点)。(2)在森林中选出两个根结点权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为左、右子树结点权值之和。(3)从森林中删除选取的两棵树,并将新树加入森林。(4)重复执行(2)和(3),直到森林中只剩...原创 2020-02-03 12:18:59 · 1756 阅读 · 0 评论 -
枚举算法6——谁在说谎
谁在说谎。张三说李四在说谎,李四说王五在说谎,王五说张三、李四都在说谎。请问到底谁在说谎。【分析】这是一个逻辑推理题,用正常的推理方法无法得出答案,我们可以先假设一个条件成立,然后根据这个条件进行推理,如果得出的结果不予条件矛盾,则说明假设条件成立;如果推出的结果与已知条件矛盾,则说明条件是错误的。这种方法在数学上交反证法。如果张三说的是真话,则李四说的是假话,进一步推出王五说的是真话...原创 2020-02-03 09:42:16 · 943 阅读 · 0 评论 -
枚举算法5——填数游戏
填数游戏,如图所示每个汉字代表一个数字,不同的汉字代表数字不同,要求填写这些汉字代表的数字。【分析】从图中可以看出,共有5个汉字,每个汉字是数字0~9中的一个。显然“北”和“会”不能是0.利用5个循环,依次枚举每个汉字代表的数字,判断相乘结果是否符合即可。code:#include<stdio.h>void main(){ int i1, i2, i3,...原创 2020-02-03 09:34:04 · 592 阅读 · 0 评论 -
枚举算法4——打印水仙花数
“水仙花数”是指这样的三位数,其各位数字立方和等于该数本身。例如,153=1^3+5^3+3^3使用枚举法遍历100--999所有整数。怎样分离出百位,十位、各位i=n/100 //百位j=n/10%10 //十位k=n%10 //各位code:#include<stdio.h>void main(){ int i, j, k, n;...原创 2020-02-03 08:20:57 · 1462 阅读 · 0 评论 -
枚举算法3——五猴分桃
五猴分桃:五只猴子一起摘了一堆桃子,因为太累了决定先睡一觉再分。一会其中一个猴子先过来将桃子分成五分,剩了一个桃子就给吃了,并拿走其中一份。一会第2只猴子过来。又将剩下的桃子分成5份,发现多了一个桃子给吃了,并拿走其中一份,接着来的第3只、4只、5只猴子都是这样做的,它们一共摘了多少桃子,第5只猴子走后剩多少。【分析】桃子总数S0,五个猴子分别拿走S1,S2,S3,S4,S5:S0=5*...原创 2020-02-03 08:10:51 · 890 阅读 · 0 评论 -
枚举算法2——百钱买百鸡
百钱买百鸡共计3元一只,母鸡5元一只,小鸡1元三只,一百元买一百只鸡。请写出公鸡、母鸡、小鸡的数目。【分析】假设公鸡数为cock、母鸡数为hen、小鸡数为chick,得到两个关系,cock+hen+chick=100,3*cock+5*hen+chick/3=100可以采用枚举法不难得到cock的范围[0,33],hen的范围[0,20]。code:#include&...原创 2020-02-03 07:52:58 · 983 阅读 · 0 评论 -
枚举算法1——判断n能否被3、5、7整除
枚举算法,也称为穷举算法它是编程中常用的一种算法。在解决某些问题时,可能无法按照一定规律从众多的候选答案中找到正确答案。此时,可以从众多的候选解中逐一取出候选答案,并验证候选答案是否为正确的解。我们将这种方法称为枚举法。枚举法的缺点:运算量比较大,解题效率不高。如果枚举范围太大,在时间上就难难以承受。优点:思路简单,编程编写和调试方便。判断n能否被3、5、7整除输入一个正整数n,判断...原创 2020-02-03 07:44:19 · 4225 阅读 · 1 评论 -
递归算法10——复杂递归之大牛生小牛问题
一只刚出生的小牛,4年后生一只小牛,以后每年生一只,现有一只刚出生的小牛,问20年后共有多少只。【分析】问题可以分成两种情况处理:小于4年时,只有一只小牛;大于4年时,小牛长成大牛,开始生小牛。递归函数可以这样描述:如果year<4,则返回1表示只有一头牛;当year≥4时,第4年的大牛开始生小牛,每年生一个。而且每隔3年,小牛长成大牛,开始生小牛。code:...原创 2020-02-02 15:42:30 · 3675 阅读 · 0 评论 -
递归算法9——复杂递归之汉诺塔问题
汉诺塔问题是源于印度的一个古老传说。上帝创造世界的时候做了三根金刚石柱子,在一根柱子从上往下按照大小顺序摞着64片金属圆盘。上帝命令婆罗门把圆盘从下面开始按照大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间只能移动一个圆盘。【分析】这个问题其实就是将n个圆盘从柱子A上移动到柱子C上,在移动过程中可以利用柱子B,每次只能移动一个圆盘,且始终保持大圆盘在下,...原创 2020-02-02 15:35:08 · 471 阅读 · 1 评论 -
递归算法8——复杂递归之台阶问题
某人上楼梯,一步可以买一个台阶,两个台阶或三个台阶,共有n个台阶。编程实现输出它所有可能的上法。例如n=41 1 1 11 1 21 2 11 32 1 12 23 1由题意可知,可以将问题分成3种情况:一次上一个台阶、一次上两个台阶、一次上三个台阶。在递归函数中,需要引入一个参数n,用来表示每次比上多少...原创 2020-02-02 13:01:30 · 1573 阅读 · 0 评论 -
递归算法7——复杂递归之和式分解
和式分解给定一个正整数n,输出和为n的所有不增的正整数和式。【问题】要求给定一个正整数n,输出和为n的左右不增的正整数和式。例如,n=5,则输出的和式结果为:5=55=4+15=3+25=3+1+15=2+2+15=2+1+1+15=1+1+1+1+1【分析】这是2009年人民银行笔试题目,引入数组a,用来存放分解出来的和数,其中,a[k]存放第k分解出来的和数。...原创 2020-02-02 12:36:58 · 935 阅读 · 0 评论 -
递归算法6——复杂递归之颠倒字符串
复杂递归算法就是在递归调用函数的过程中,还需要一些处理,例如,保存或修改元素值。颠倒字符串、和式分解、汉诺塔问题都是属于比较复杂的递归算法。颠倒字符串使用递归实现将一个字符串颠倒后重新存放在原字符串中。【分析】假设字符串存放在数组s中,递归函数原型如下:int RevStr(char s[], int i);为颠倒当前位置的字符,需要先求出颠倒后当前字符串中的存放位置,函数首...原创 2020-02-02 10:03:02 · 1870 阅读 · 0 评论 -
递归算法5——简单递归之求最大公约数
用递归函数求两个整数M和N的最大公约数。【分析】两个整数M和N的最大公约数具有以下性质:code:#include<stdio.h>#include <iostream>int gcd(int m, int n);void main(){ int m, n; printf("请输入两个正整数:"); scanf("%d,%d", &...原创 2020-02-01 18:52:13 · 8201 阅读 · 0 评论 -
递归算法4——简单递归之数制转换
使用递归函数实现十进制转换为二进制整数【分析】除二取余法,不断地将商作为新的被除数除以2,而每次的余数序列就是所求的二进制数。当num==0时,回推阶段结束,开始递推,返回;否则,将商作为新的被除数,即调用函数同时输出每层的余数。code:#include<stdio.h>#include <iostream>void DectoBin(int n...原创 2020-02-01 18:43:58 · 1360 阅读 · 0 评论 -
递归算法3——简单递归之求n个数的最大值
【分析】假设元素序列存放在数组a中,数组a中n个元素的最大值可以通过将a[n-1]与前n-1个元素最大值比较后得到。当n=1时有findmax(a,n)=a[0];当n≥1时,有findmax(a,n)=(a[n-1] > findmax(a, n-1) ? a[n-1] : findmax(n-1))。也就是说,数组a中只有一个元素时,最大者是a[0],超过一个元素时,则要进行...原创 2020-02-01 18:32:17 · 6109 阅读 · 0 评论 -
递归算法2——简单递归之斐波那契数列(递归法)
斐波那契数列指的是这样的一个数列:0,1,1,2,3,5,8,13,21,......从第3个数起,每个数都是前两个数之和。编写算法,输出斐波那契数列的前n项。【分析】斐波那契数列可以写成如下公式:当n=4时,求fibibacci(4)的值过程如下图所示。其中,图中阴影部分为对应的函数值。求fibibacci(4)的值,需要知道fibibacci(3)与fibibacci...原创 2020-02-01 14:12:10 · 11738 阅读 · 0 评论 -
递归算法1——简单递归之求n的阶乘
递归就是自己调用自己,它是设计和描述算法的一种有力工具,常常用来解决比较复杂的问题,能采用递归描述的算法通常有以下特征:为求解规模为N的问题,设法将它分解成规模较小的问题,从小问题的解容易构造出大问题的解,并且这些规模问题较小的问题也能采用同样的分解方法,分解成规模更小的问题,并能从这些更小问题的解构造出规模较大问题的解。一般情况下,规模N=1时,问题的解是已知的。递归是一种分而治之、将复杂...原创 2020-02-01 10:14:11 · 69970 阅读 · 7 评论 -
迭代算法8——近似迭代法之求定积分
求定积分【分析】定积分的几何意义就是求曲线f(x)与y=0,x=a,x=b所围成的曲顶梯形的面积。为了得到定积分的值,需要将连续的对象分割为容易求解的子对象,然后利用迭代法对表达式反复操作。求定积分的方法有两种:矩形法和梯形法。下面主要以梯形法为例具体讲解:函数y=f(x)的图像如图所示从图中可以看出,一个曲顶梯形可以分割为许许多多长度为h的小曲顶梯形,每个小曲顶...原创 2020-01-31 15:25:47 · 2676 阅读 · 0 评论 -
迭代算法7——近似迭代法之牛顿迭代法
利用牛顿法求方程x^4-3x^3+1.5x^2-4=0的根。【定义】牛顿迭代法是用于求方程或方程组近似根的一种常用算法。1.推导过程设已知方程f(x)=0的近似根为x0,则在x0处的泰勒展开式为:取线性部分即泰勒展开式的前两项作为非线性方程f(x)=0近似方程,则有:如果,则方程的解为这样就得到了一个迭代序列:接下来,就可以利用该迭代公式求方程的近似解...原创 2020-01-31 13:20:58 · 4332 阅读 · 0 评论 -
迭代算法6——近似迭代法之二分法
利用二分法求方程3x^3-13x+2=0在区间[1,9]的根。【分析】1.相关概念零点:函数y=f(x)的零点就是f(x)=0的根,如果y=f(x)有根存在,则说明函数y=f(x)的图像与x轴有交点。2.零点存在的判断方法函数y=f(x)在区间[a,b]上连续,且f(a)·f(b)<0,则y=f(x)在(a,b)内有零点存在,如图所示。3.二分法定义对于区间[...原创 2020-01-30 14:53:56 · 3439 阅读 · 0 评论 -
迭代算法5——近似迭代法之求一个数的平方根
【分析】求平方根的迭代公式:x1 = 1/2 × (x0 + a/x0)。算法步骤如下:(1)先定一个初值x0,作为a的平方根值,取a/2作为a的平方根初值。(2)利用上述迭代公式求出一个x1,把新的x1代入x0中。(3)再次利用迭代公式求出一个新的x1,比较x1和x0,如果它们的差值小于指定的EPS(假设为1e-6),该值非常趋近于真正的平方根,x1可以作为平方根的近似值;否则将x...原创 2020-01-30 13:10:53 · 1504 阅读 · 0 评论 -
迭代算法4——精确迭代法之角谷猜想
输入一个正整数,求出角谷猜想过程中的每一个数。【定义】角谷猜想。日本数学家角谷静夫在研究自然数时发现了一个现象:对于任意一个自然数n,如果m为偶数,则将其除以2;如果n为奇数则将其乘以3,然后再加1。按照上述方法经过有限次运算后,总可以得到自然数1。人们将角谷静夫的这一发现称为“角谷猜想”。例如对于自然数21,因为21是奇数,先将其乘以3,再加上1,得到64。64是偶数除以2,得到3...原创 2020-01-30 10:34:20 · 1574 阅读 · 0 评论 -
迭代算法3——精确迭代法之质因数的分解
质因数的分解任给一个整数M,编程实现质因数的分解。【分析】算法步骤如下:(1)如果M不等于1,则从x=2开始,让M除以x,如果够被整除,则x是其中的一个因子,将x存入数组a中,并用商代替M。(2)如果M能够被x整除,转步骤(1)执行;否则,则将x增1。(3)如果M不为1,则步骤(1)执行;否则,算法结束。数组a中的元素即为所求。code:#include<st...原创 2020-01-30 10:18:37 · 439 阅读 · 0 评论 -
迭代算法2——精确迭代法之十进制转换为二进制
【分析】用除二取余法。具体步骤如下:(1)将该数除以2,得到商和余数。(2)将商作为被除数,并除以2,得到新的商和余数。(3)重复执行(2),直到商为0为止。将余数反过来排列即为所求。code:#include<stdio.h>#include <iostream>void main(){ int i, n, x, a[16]; printf...原创 2020-01-30 09:47:09 · 1039 阅读 · 0 评论 -
迭代算法1——精确迭代法之最大公约数与最小公倍数
迭代算法也称为辗转法,它是一种不断用旧的变量值递推得到新值的过程。迭代法是用计算机解决问题的一种基本方法,它利用计算机运行速度快、适合做重复性操作的特点,让计算机对一组操作重复执行,每次执行时都是从变量的旧值推出一个新值。迭代法与递推法的相同之处在于都是使用循环语句实现,不同之处在于:<>迭代法使用while循环求解,递推法使用for循环实现。<>迭代法在迭代结束...原创 2020-01-30 09:40:07 · 1793 阅读 · 0 评论 -
递推算法6——逆推法之存取问题
该存多少钱小明打算为自己的三年研究生生活准备了一笔学费,一次性的存入银行,保证每年年底取出1000元,到第3年学习结束时刚刚好取完。假设银行一年整存零取得月息为0.31%,请问需存入银行多少钱?【分析】这也是已知结果求已知条件的问题,同样采用逆推法。如果第3年年底连本带息取出1000元,则需先求出第3年年初的银行存款:假设第3年年初的银行存款为x元,则有x×(1+0.0031×12)...原创 2020-01-29 14:09:35 · 1124 阅读 · 0 评论 -
递推算法5——逆推法之猴子摘桃问题
逆推法是根据结果推出已知条件,推算方法与顺推法类似,只是需要将结果作为初始条件向前推算。比较典型的例子是猴子摘桃和存取问题猴子摘桃【问题描述】猴子第一天摘了若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃前一天的一半零一个。到第十天的时候再想多吃,见只剩下一个桃子了。求第一天一共摘了多少桃子?【分析】根据第10天的桃子个...原创 2020-01-29 10:07:34 · 3867 阅读 · 1 评论 -
递推算法4——顺推法之杨辉三角问题
【定义】杨辉三角也称贾宪三角,具有二项展开式的二项式系数即组合数的性质,这是研究杨辉三角其他规律的基础。杨辉三角具有以下性质:(1)每行数字左右对称,由1开始逐渐变大,然后变小,返回1。(2)第n行的数字个数为n个。(3)第n行的数字之和为 2^(n-1)。(4)每个数字等于上一行的左右两个数字之和,即 C_n^1 = C_{n-1}^{i-1} + C_{n-1}^{i}。(5...原创 2020-01-28 18:21:49 · 4605 阅读 · 0 评论 -
递推算法3——顺推法之母牛生小牛问题
有一头母牛,每年年初生一头小母牛,每头小母牛从第3个年头起每年年初也可以生一头小母牛。求在第20年时有多少头母牛。令x0_i,x1_i,x2_i,x3_i分别表示第i年后刚生下的母牛、满1岁的母牛、满2岁的母牛以及可生小母牛的母牛。根据问题,可以得到递推公式如下:初始时,只有1头刚出生的小母牛,因此有x0_0=1,x1_0=x2_0=x3_0=0;第i-1年刚生下的小母牛变为第i年...原创 2020-01-28 16:04:56 · 4092 阅读 · 0 评论 -
递推算法2——顺推法之将十进制转换为二进制
递推算法2——顺推法之将十进制转换为二进制编写算法输入一个十进制数转换为二进制数【算法思想】十进制数可分为整数部分和小数部分,将十进制数转为二进制数可以分别将整数和小数部分进行转换。其中,将十进制整数转换为二进制整数采用的方法是“除二取余”,将十进制小数部分主要的方法是“乘二取整”。1.除二取余法——将十进制整数转换为二进制整数所谓除二取余法,就是把十进制整数除以2,得到一个商和余...原创 2020-01-28 11:40:22 · 1132 阅读 · 0 评论 -
递推算法1——顺推法之斐波那契数列
递推算法是一种比较简单的算法,即通过已知条件,利用特定关系得到中间结论,然后得到最后结果的算法。递推算法分为顺推和逆推两种,本章通过几个典型的例子来说明递推算法的应用。顺推法顺推法是指从已知条件出发,逐步推算出要解决问题的方法。例子,斐波那契数列、进制转换等问题都可以利用顺推法解决。斐波那契数列(递推法)如果1对兔子每月能生1对小兔子,而每对小兔子在它出生后第3个月,又能开始生一对小...原创 2020-01-27 19:05:05 · 3304 阅读 · 0 评论