摘要:关于全排列的代码在网上收集、研究了好几种,包括我自己写的也有循环实现。循环是最容易理解的,按照判定条件进行嵌套,但缺点是,如果有十个八个数据,循环嵌套的层数太深,十分臃肿。很明显,如果一段代码不够简练,我自己也不满意,肯定想尽办法解决它。所以再次记录一下全排列的递归实现。 还是按照自己的一套方法,以
阅读全文
03 2016 档案
摘要:依然是穷举,这些代码让人怀疑for循环天生就是为穷举而生!题:从0~9的10个数字中,选出不重复的五位数,其个位数为奇数的可能为多少? 第二种解法:递归搜索
阅读全文
摘要:题:x+y+z=n,其中(n>=3),求x,y,z的正整数解的个数根据图象法:x>=1,y>=1,x+y<=n-1
阅读全文
摘要:设n为正整数,求三边长a<=b<=c=n的三角形的个数?这道题的特殊在于用图像法分析计数 用图像解,当n为奇数时,得到:f(3)=1+3f(5)=1+3+5f(7)=1+3+5+7..得到公式:f(n)=f(n-2)+n(其中n>=3) 当n为偶数时,得到:
阅读全文
摘要:题:有三个城市a,b,c,一个人从a城出发,呆一天然后去另一个城市,经过四天,又回到a城的走法?解:把四天看成四个盒子,第一个盒子必定是a,然后在剩下的三个盒子里面置入数字,在置入数字的过程中,产生约束条件。(可以理解为带条件的"排列")比如说,a->b->c>b->a,可以看出,第二个盒子和第一个
阅读全文
摘要:第一个模型,先简化问题,求20以内被7整除的数。一个自然序列中的数能被7整除,说明以7为周期,序列中有多少个这样的周期就说明有多少个数能被7整除,得到20/7=2。第二个模型,扩展模型一,假如一个自然序列中的数能被3和7整除,就以3*7=21为周期,序列有多少个这样的周期就说有多少个数被3和7整除,
阅读全文
摘要:#include using namespace std; int main() { int c; int m[4]={45,60,100,120}; for(int i=1;ib*/ { m[i-1]=m[i-1]+m[i]; m[i]=m[i-1]-m[i]; m[i-1]=m...
阅读全文
摘要:阶乘:1x2x3x4.....N,仿照2的N次方的手法,只不过这次从前往后计算,得到的数从左往后,依次为个位十位百位...等等。例如:021,表示120 这个算法的一个缺点是,每次都要把数组乘一遍,有什么办法能优化它呢? 一、首先对阶乘结果的位数进行优化,采用的思路是: 得到位数的好处是,不用事先定
阅读全文
摘要:理论和习题来源于书本,有些能用计算机模拟的题尽量用代码来解。 1.5个球放在3个不同的盒子里面,允许有盒子不放球,求有多少种可能?解:穷举,设盒子A,B,C,每个盒子都有0~5个球的可能,但是三个盒子相加必定为5,得到代码: 2.从n个不同元素中,任取m个(n>=m)不同元素,把这个m个元素有顺序地
阅读全文
摘要:513不停的重复形成513513513....,求第n位是几的计算公式。
阅读全文
摘要:把圆分成n个不相等的扇形,并且用红,蓝,绿三种颜色给扇形染色,但不许相邻的扇形有相同的颜色,共有多少种染法?解:设把圆分成扇形S1,S2,...Sn,开始时,S1有3种染法,S1染色后,S2的染法有2种,S3也有2种,因为S3可以和S1同色。这样的顺次染下去,染色方法的总数为: 但是这些染法中,还包
阅读全文
摘要:代换法的思想:将函数中的自变量x适当地代换以别的自变量(代换时注意不使函数定义域发生变化),得到一个新的函数方程,把新得到的这个函数方程与原有的函数方程联立,组成一个关于未知函数的代数方程组。再应用消元法,解这个方程组,就求得了原函数方程的解。
阅读全文
摘要:如果一个数恰好等于它的因子之和,则称此数是完全数。例如:6=1+2+3,(包含1,但不包括本身) 首先穷举它的因数,这里优化一下。根据因数的性质,不小于2的自然整数的可能样式: 2x.....x最大因数=C3x.....x最大因数=C.............优化:根据观察,数C的最大因数(不包括本
阅读全文
摘要:相关联的补充【完全数】:http://www.cnblogs.com/tinaluo/p/5317661.html
阅读全文
摘要:题:三位数的整数,将首位移至末位形成的数是原数的3倍加2,求原数。三位十进制整数的表示(首位为y,后续为x):100y+x(0<=x<=99),转换后的三位数:10x+y,于是得到10x+y=3(100y+x)+2,化简:7x-2=299y,其中:1<=y<=9。计算机穷举:y=1或8,由x的约束条
阅读全文
摘要:通项、递推、递归的区别:通项公式,是用自然数n的表达式表示数列的“通项”f(n)的公式,递推,是由含有数列前边的若干项的表达式表示后边某一项的公式。如果表达式中仅含数列前边的若干项(允许有常数系数),这个公式就叫递归公式。 从函数方程观点看,递推,递归公式实际都是函数方程,而通项公式则是它们的解。为
阅读全文
摘要:题目:n个同学排成一队,一共多少种排法?(从函数方程的思路理解全排列)设n个同学排队,共有f(n)种排法,再插入一个,对于原来已经排列的每种队型,可以放在第1位,第2位...n+1种可能,得到函数方程:f(n+1)=(n+1)f(n),解方程如下:
阅读全文
摘要:删除分为两种可能:1.只有左子树,或右子树,或叶结点。 叶结点、只有右子树的情况相似。2.有左子树和右子树的情况 先看完整代码: int Delete(Tree &p) { Tree q,s; if(p->right==NULL)/*只有左子树*/ { q=p; p=p->left; free(q)
阅读全文
摘要:二叉排序树,又称为二叉查找树。它或者是一棵空树,或者具有下列性质:1.若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值2.若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值3.它的左、右子树也分别为二叉排序树 简言而之:中序遍历就一定会得到从小到大排列的序列! 查找操作:首
阅读全文
摘要:主要对mid的计算进行改进,未改进之前的计算公式:改进后的公式:修改代码后:
阅读全文
摘要:来源于书本,这个小技巧还是记录一下,其实它所表达的意思就是,for循环和while循环的一点微妙区别。在for循环中,比如: 比较、自增、加上边界的判定,一共需3步,而while循环,则只需要两步,减去了边界判定的一步。
阅读全文
摘要:这种查找方法要求查找表的数据是线性结构保存,并且还要求查找表中的数据是按关键字从小到大有序排列的。二分查找是一种递归过程,每折半查找一次,可使查找范围缩小一半,当查找范围缩小到只剩下一个元素,而仍不等于关键字,说明查找失败,在最坏的情况下,折半查找所需要的比较次数为O(nlog2n)..
阅读全文
摘要:/*------------完整代码@映雪-------------*/ /*初始化一组数据,省却输入,方便调试*/ #include using namespace std; typedef struct { int value[5];/*价值表*/ int weight[5];/*重量表*/ int num;/*数量*/ int limitw;/*最...
阅读全文
摘要:位数计算: [ N*lg2 ] +1log10(2)=0.301029996
阅读全文
摘要:基础知识。在经历了二重递归的演练之后,再看一重递归,显的简易多了,先看十进制转二进制: 十进制转任意进制这个代码的一个特别地方在于使用一个flag[]数组,包括0~F的一个串,如果余数是几,就把相应的flag[]中的元素移到数组中,这种手法已经是第二次看到过,对于字符串很实用!
阅读全文
摘要:#include "stdio.h" #include "string.h" char *str(char d[],char s[]) { char *p=d;; while(*p!='\0')p++; do { *p++=*s++; }while(*s!='\0'); *p=0; return d; } int m...
阅读全文
摘要:题目:源串="abcabcabcababcabcabcababcabcab",目标串="abc",求目标串在源串中出现多少次?这题相对比较简易,用的是原始方法,调用strstr()函数,如果找到目标串,函数返回出现目标串位置的首地址,下一步再将这个指针+1转移到strstr()函数中进行下一轮的匹配
阅读全文
摘要:题目:求字符串[(())]的括号是否匹配,这个题相对比较简易,也记录一下。思路,左括号就入栈,遇到右括号就出栈一个元素进行匹配判定,构造一个switch。同时,设置一个监视flag,初始置1,一旦不匹配就将之置为0,也就是以后就不用再比较了。
阅读全文
摘要:题目:集合A={1,2,3,5},从中任取几个数相加等于10,并打印各得哪几个数?补充参照:http://www.cnblogs.com/tinaluo/p/5294341.html上午弄明白了幂集的问题,不得不说这是一个极大的突破!只要把这个思路缕清楚了,就可以解很多问题。幂集问题,简而言之就是穷
阅读全文
摘要:我一直在想着这个事,早晨起来五六点,躺在床上冥想。突然悟解了,真如某些书上写的,大道不过三言两语,说破一文不值。还是按照老方法,把问题最大程度的精简,现在求集合A={a,b}的幂集,只有两个元素,应该有{a,b},{a},{b},{x}四种可能。如果把这两个元素弄清楚了,其余的也都一样, 仅仅是数量
阅读全文
摘要:/*摘自书本,这种算法很绕!*/
阅读全文
摘要:先把问题做最大程度的简化,不用框一个50*50的大迷宫,只需要压缩在3*3的二维数组中模拟,这个弄清楚了,再大的也是一样。移动方向只包括下移和右移两种方式。先下移,再右移。在这个二维数组中,约定规则:0表示通路,-1表示路径(可通过),1表示障碍物。于是得到一个二维数组的形式如下:(由于四周需要障碍
阅读全文
摘要:/*-----深度优先搜索----全排列--------*/ #include using namespace std; int a[10],book[10],n; void dfs(int step)/*step第几个盒子*/ { int i; if(step==n+1) { for(i=1;i>n; dfs(1); return 0...
阅读全文
摘要:/*-------完整代码----映雪-------*/ #include using namespace std; void sort(int left,int right,int a[]) { int i,j,t,temp; if(left>right) return; temp=a[left]; i=left; j=right; ...
阅读全文
摘要:计算数组长度 int a[]={1,2,3,5,6}; int Length=sizeof(a)/sizeof(int); 交换a和b的值,不借用辅助变量 a=a+b; b=a-b; a=a-b; 将0~9的字符转化为整数 char a='1'; a=a-'0'; 相同的case结果合并 switc
阅读全文
摘要:图由数据元素和连接数据元素的线构成。在图中数据元素称为顶点(Vertex),连接顶点的线称为边(Edge)。一个图是由顶点集合和边集合组成的。一般记为形式:G=(V,E),或G=(V(G),E(G))。 1.有向图和无向图无向图:边没有方向。例(V1,V2),也可写为(V2,V1)。有向图:边有方向
阅读全文
摘要:穷举的一种应用,计算x+2y+3z=50的非负整数解。先约束每个变量的最大值,x=50,y=25,z=50/3。
阅读全文
摘要:计算1+2*3=,这个程序还是比较绕的,先将程序简化,只做+-*/和=五个运算符的关系。首先,假定这五个运算符中,=号的优先级最低,其次是+-,最高为*/。接着约定,"1+2*3=",为字符串。 第一步,将=号入栈,作为栈底。然后,再依次进行后续的比较。约定:栈顶符号<字符串符号,则字符串符号入栈。
阅读全文
摘要:基本结构: 创建 第一种:先初始化,再创建链表。在初始中,让头结点的next为NULL; 第二种:不初始化,直接创建,又分为以下几种。<1>尾插法,假如创建n个结点。(从前往后建立结点,推荐!) <2>头插法:不需要额外的指针、 插入和删除插入:在第i个位置处插入数据,游标p移到第i-1个位置(也即
阅读全文
摘要:不带头结点,需要创建n个结点,包括三个指针,头指针head,一个游标指针p和创建结点的s....
阅读全文
摘要:另一种解法:将数组全部置1,累计相加到报数,则将该位置置为0,意为该位出列,如此反复。关键在于:把数组作环状处理,这个手法已经演练很多遍了!
阅读全文
摘要:/* 此解法有一bug,假如有8个人,从第一个人开始数,每说到1就删除,相当于自删除,程序崩溃 */约瑟夫问题,有n个人,编号为1,2,...,n,围成一个圆圈,按照顺时针方向从编号为k的人从1开始报数,报数为m的人出列,如此重复下去,直到所有的人都出列。编写一个算法,要求输入n,k,m,按照出列的
阅读全文
摘要:/* 完整代码@映雪 */ #include <iostream> using namespace std; #define change(x,y); \ a[x]=a[x]+a[y];\ a[y]=a[x]-a[y];\ a[x]=a[x]-a[y]; void f(int a[],int l,i
阅读全文
摘要:/*网络摘录加工*/尾部递归是一种编程技巧。递归函数是指一些会在函数内调用自己的函数,如果在递归函数中,递归调用返回的结果总被直接返回,则称为尾部递归。尾部递归的函数有助将算法转化成函数编程语言,而且从编译器角度来说,亦容易优化成为普通循环。这是因为从电脑的基本面来说,所有的循环都是利用重复移跳到代
阅读全文
摘要:问题提出:求数组A={1,5,7,22,9}中的最大值。这种递归非常绕,需要简化来看,比如拿只含两个元素的数组带进去观察。如A={12,25},把问题简化到最简单。 另一种精简的算法,来源于《算法:C语言实现》117页 这种思路简化说明:把一个数组不停的二分对切,只到不能再切为止(切到只有一个元素时
阅读全文
摘要:计算1+2+3+4+5第一种,从后往前加。 第二种,从两边对加,例:(1+5)+(2+4)+3,需要判定,假如元素个数为偶,则左边+1==右边,如果为奇数,则左边==右边:
阅读全文
摘要:有一个背包最多可装重量8千克的物品,假设要用该背包装如下水果,要求使背包中装的物品的价值最大,应该装下列哪些物品才能达到要求? 解题思路:首先穷举所有组合可能,有5种物品,一共组合32-1种可能。然后排除超重的可能,在不大于8千克的前提下,再计算各种可能的总价值,最后,比较这些组合的价值,得到最大值
阅读全文
摘要:选择排序的基本思想:对n个记录进行扫描,选择最小的记录,将其输出,接着在剩下的n-1个记录中扫描,选择最小的记录将其输出,不断重复这个过程,直到只剩一个记录为止... 简单选择排序法类似人的排序习惯:从数据中选择最小(或最大)的一个数据,然后将该数与第1个数交换,接下来从剩下数据中选择最小(或最大)
阅读全文
摘要:冒泡排序法是一种相邻数据交换的排序方法。基本思想是:对待排序记录关键字从后往前(逆序)进行多遍扫描,当发现相邻两个关键字的次序与排序要求的规则不符时,就将这两个记录进行交换。这样,关键字较小的记录将逐渐从后面向前面移动,就像气泡在水中向上浮一样。 改进算法:设置一个标志变量flag,在每一遍扫描之前
阅读全文
摘要:【补充另一种方法:】http://www.cnblogs.com/tinaluo/p/5249195.html看笛卡尔积时突然想到的问题,现有集合A={1,5,7,10,12},集合B={5,10,12},检测集合A从前往后的有序方向是否包含集合B的每一个元素?经过计算,发现使用队列比较合适,如图:
阅读全文
摘要:补充:(改进:一种递归方法)http://www.cnblogs.com/tinaluo/p/5294341.html已知集合S,S的幂集合是指集合S所有子集的集合,用P(S)来表示,例如: 这让我想起二进制模拟,假如现在用算法模拟打印幂集合(空集除外),该怎么办呢?二进制模拟起到很好的作用,首先来
阅读全文
摘要:根据书上描述,共享栈的特点是:两个栈顶,置放在数组两头,入栈迎面相向,相遇时栈满,看图示: 主要处理两步工作:第一,栈空的标志。这里沿用前面的约定,左栈用-1,而右栈用MAXSIZE,也就是放在数组的最左右两端。第二,判满。这里采用左栈+1=右栈表明栈满。 此外,还需要一个状态标志flag,让用户选
阅读全文
摘要:对于数组(也可为线性表),逆置就是首尾数据两两交换,首先计算交换的次数: 交换次数=(len-1)/2 第二种,单链表,这个困难很多,因为链表只有一个头指针,要依赖这个指针对整个链条进行操作,需要很高的技巧!首先观察链表: 如果逆置(反序),交换数据是不可能的,只有换种思路,把结点之间的指针指向反转
阅读全文
摘要:《编程之美》221页,问题:字符串scr=“AABCD”,字符串des="CDAA",循环移位src,是否包含串des? 首先考虑的是移位的问题,有两种可能,要么左移,要么右移,书中采用的是左移的方式。在移动AABCD之后,得到 ABCDA,问题就在于这个最先移动的A放在哪?根据前面的学习,马上可以
阅读全文
摘要:除此之外,并集的这个思路还可以求两个集合的相同元素,例,A={1,3,5,7},B={2,3,7},求两数组的相同元素
阅读全文
摘要:#include using namespace std; void draw(int n,int x) { if(x0) { draw(n-1); draw(n,1); cout using namespace std; int main() { for(int i=1;i<=9;i++) { ...
阅读全文
摘要:首先,把书上的算法简化一下,直接用数组研究更直观。 定义一个数组: 它假设第一个元素是有序的,然后用第二个元素(下一个元素)和它进行比较,通过循环移动判定,得到一个有序列。得到一个有序列之后,再用下一个元素和这个有序列进行比较,这里的比较,就是局部比较,采用的是尾插法,从后往前。 比如,前两个元素排
阅读全文
摘要:题目:表A 1 3 5,表B 2 4 6,都呈非递减排序,现将两个表合并成一个表,也呈非递减排序,存放在A中(或者B中),言外之意是不能开辟新表!拿出B中数据,沿着A的后面一直往前比较,如果小于就一直比,如果不小于就插入数据。 这样就相当于数组中的元素两两移动 现在出现一种情况,假如A的元素值一直大
阅读全文
摘要:四则运算:http://www.cnblogs.com/tinaluo/p/5282045.html ..
阅读全文
摘要:链栈和顺序栈的区别在于,链栈不受空间限制,根据链表生成,如图,首先观察它的特点: 灰色表示真实数据,而top指向的结点,称之为头结点,它的数据项没存入数据,仅仅是做为一个头结点存在。在链栈的初始化中,首先创建了一个头结点,但是里面没有存放数据,如果可能,存放链栈的长度也是可以的。 如果初始化不创建头
阅读全文
摘要:摘要: 摘要: 根据树的原理做的一个单链表,这里,把单链表看做【树】的简化版。 在树的递归创建中,首先创建是头结点,所以单链表也是一样; 单链表的结构: typedef struct node{ int data; struct node *next; }*List,Node; 创建摘要: 根据树的
阅读全文
摘要:循环队列并不复杂,把几个位置规定清楚是关键!比如,front和rear各指向哪?还有一些小细节,首先观察图:从书上来看,尾端rear必定为空(特意留下一个空位置),front总是指向队头,而rear指向尾。接着是几个重要的公式 判定队列满的公式队列长度的计算公式 下面以入队列说明,首先判定队列是否满
阅读全文
摘要:结构(带头结点) 初始化 创建(n个结点) 插入 删除 遍历 销毁 结构: 判空:(head->next==head) 初始化:主要注意链表为空的条件,执行语句:L->next=L; 创建:借助一个游标p进行移动、 插入:在第i个位置处插入e,先把指针移到i-1处,然后进行操作。此外,p从头结点开始
阅读全文
摘要:基础结构: 模型建立之后,就可以创建一个实在的东西 现在需要对线性表进行初始化操作,这里用的是把length置为0。 插入操作 主要有三个部分[1] 插入之前,进行判定。这个判定又分两种情况:<1>插入元素的位置是否合法? 这里,合理的范围是在[1,L->length+1]之间,比如,在第5个位置插
阅读全文
摘要:不带头结点的单链表,递归法比较简明!(必背!) 单链表的结构: 创建第一种方法:递归的终止条件:e为0 第二种方法,创建n个节点,中止条件:n==0 遍历 查找 销毁
阅读全文
摘要:题意为,如果二叉树某结点的值为e(假定是整型二叉树),返回这个结点的指针。初看这道题,联想到二叉树可以很简单的遍历,直接返回这个指针不就行了吗?如下图所示,假如要返回值为3的结点指针: 设计好了一个函数 程序能正确运行,也确实返回了正确的指针值。可为什么书上没有采用这种方法呢?思考一下,不难发现这段
阅读全文
摘要:双向循环链表(带头结点)的创建,一共五步,如图所示: 插入结点操作: 删除结点操作(相对简单,图示略)
阅读全文
摘要:顺序栈借助游标top,主要在于栈空与栈满的判定!如图可以看出,栈空的标志是:top=-1,栈满的标志是top=MAXSIZE-1,当然,具体如何约束也可以自己约定! 初始化栈,将top置为-1; 入栈和出栈 入栈先将top++,然后插入数据,出栈,先取数据,再将top--;这个是比较容易理解的: 完
阅读全文
摘要:这里用的递归法,采用两种版本,一种是C语言,一种是C++;但是,用C语言没有“引用”,所以采用的是指向指针的指针;而C++具备“引用”,所以直接用&引用,简洁; 先看C++的代码; BiTree CreateBiTree(BiTree &T) { // 算法6.4 // 按先序次序输入二叉树中结点的
阅读全文
摘要:先序遍历:(先左后右) 先左树再右树遍历 先序遍历很有点类似于栈,可以用栈来模拟: 中序遍历: 后序遍历:
阅读全文