c算法大全常用c语言算法,包括数论算法,图论算法排序算法高精度计算树的遍历算法等等_第1页
c算法大全常用c语言算法,包括数论算法,图论算法排序算法高精度计算树的遍历算法等等_第2页
c算法大全常用c语言算法,包括数论算法,图论算法排序算法高精度计算树的遍历算法等等_第3页
c算法大全常用c语言算法,包括数论算法,图论算法排序算法高精度计算树的遍历算法等等_第4页
c算法大全常用c语言算法,包括数论算法,图论算法排序算法高精度计算树的遍历算法等等_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、数论算法1.求两数的最大公约数functiongcd(a,b:integer):integer;beginifb=0thengcd:=aelsegcd:=gcd(b,amodb);end;2.求两数的最小公倍数functionlcm(a,b:integer):integer;beginifa0doinc(lcm,a);end;3.素数的求法A.小范围内判断一个数是否为质数:functionprime(n:integer):Boolean;varI:integer;beginforI:=2totrunc(sqrt(n)doifnmodI=0thenbeginprime:=false;exit

2、;end;prime:=true;end;B,判断longint范围内的数是否为素数(包含求50000以内的素数表):proceduregetprime;vari,j:longint;p:array1.,50000ofboolean;beginfillchar(p,sizeof(p),true);p1:=false;i:=2;whilei50000dobeginifpithenbeginj:=i*2;whilej=xthenbreakelseifxmodpri=0thenexit;prime:=true;end;prime、图论算法1.最小生成树A.Prim算法:procedureprim(v

3、0:integer);varlowcost,closest:array1.maxnofinteger;i,j,k,min:integer;beginfori:=1tondobeginlowcosti:=costv0,i;closesti:=v0;end;fori:=1ton-1dobegin寻找离生成树最近的未加入顶点kmin:=maxlongint;forj:=1tondoif(lowcostjmin)and(lowcostj0)thenbeginmin:=lowcostj;k:=j;end;lowcostk:=0;将顶点k加入生成树生成树中增加一条新的边k到closestk修正各点的low

4、cost和closest值forj:=1tondoifcostk,jlwocostjthenbeginlowcostj:=costk,j;closestj:=k;end;end;end;primB.Kruskal算法:(贪心)按权值递增顺序删去图中的边,若不形成回路则将此边加入最小生成树。functionfind(v:integer):integer;返回顶点v所在的集合vari:integer;begini:=1;while(i=n)and(notvinvseti)doinc(i);ifi0dobegini:=find(eq.v1);j:=find(eq.v2);ifijthenbegini

5、nc(tot,eq.len);vseti:=vseti+vsetj;vsetj:=;dec(p);end;inc(q);end;writeln(tot);end;2.最短路径A.标号法求解单源点最短路径:vara:array1.maxn,1.maxnofinteger;b:array1.maxnofinteger;bi指顶点i到源点的最短路径mark:array1.maxnofboolean;procedurebhf;varbest,best_j:integer;beginfillchar(mark,sizeof(mark),false);mark1:=true;b1:=0;1为源点repea

6、tbest:=0;fori:=1tondoIfmarkithen对每一个已计算出最短路径的点forj:=1tondoif(notmarkj)and(ai,j0)thenif(best=0)or(bi+ai,j0thenbeginbbest_j:=best;markbest_j:=true;end;untilbest=0;end;bhfB.Floyed算法求解所有顶点对之间的最短路径:procedurefloyed;beginforI:=1tondoforj:=1tondoifaI,j0thenpI,j:=IelsepI,j:=0;pI,j表示I到j的最短路径上j的前驱结点fork:=1tond

7、o枚举中间结点fori:=1tondoforj:=1tondoifai,k+aj,kai,jthenbeginai,j:=ai,k+ak,j;pI,j:=pk,j;end;end;C.Dijkstra算法:varb,pre:array1.maxnofinteger;prei指最短路径上I的前驱结点mark:array1.maxnofboolean;a:array1.maxn,1.maxnofinteger;proceduredijkstra(v0:integer);beginfillchar(mark,sizeof(mark),false);fori:=1tondobegindi:=av0,i

8、;ifdi0thenprei:=v0elseprei:=0;end;markv0:=true;repeat每循环一次加入一个离1集合最近的结点并调整其他结点的参数min:=maxint;u:=0;u记录离1集合最近的结点fori:=1tondoif(notmarki)and(dimin)thenbeginu:=i;min:=di;end;ifu0thenbeginmarku:=true;fori:=1tondoif(notmarki)and(au,i+dudi)thenbegindi:=au,i+du;prei:=u;end;end;untilu=0;end;3.计算图的传递闭包Procedu

9、reLonglink;VarT:array1.maxn,1.maxnofboolean;BeginFillchar(t,sizeof(t),false);Fork:=1tondoForI:=1tondoForj:=1tondoTI,j:=tI,jor(tI,kandtk,j);End;4.无向图的连通分量A.深度优先proceduredfs(now,color:integer);beginfori:=1tondoifanow,iandci=0thenbegin对结点I染色ci:=color;dfs(I,color);end;end;B宽度优先(种子染色法)5.关键路径几个定义:顶点1为源点,n

10、为汇点。a.顶点事件最早发生时间Vej,Vej=maxVej+wI,j,其中Ve(1)=0;b.顶点事件最晚发生时间Vlj,Vlj=minVlj-wI,j,其中Vl(n)=Ve(n);c.边活动最早开始时间EeI,若边I由j,k表示,则EeI=Vej;d.边活动最晚开始时间曰I,若边I由j,k表示,则曰I=Vlk-wj,k;若Eej=Elj,则活动j为关键活动,由关键活动组成的路径为关键路径。求解方法:a.从源点起topsort,判断是否有回路并计算Ve;b.从汇点起topsort,求Vl;c.算Ee和El;6.拓扑排序找入度为0的点,删去与其相连的所有边,不断重复这一过程。例寻找一数列,其中

11、任意连续p项之和为正,任意q项之和为负,若不存在则输出NO.7.回路问题Euler回路(DFS)定义:经过图的每条边仅一次的回路。(充要条件:图连同且无奇点)Hamilton回路定义:经过图的每个顶点仅一次的回路。一笔画充要条件:图连通且奇点个数为0个或2个。9.判断图中是否有负权回路Bellman-ford算法xI,yI,tI分别表示第I条边的起点,终点和权。共n个结点和m条边。procedurebellman-fordbeginforI:=0ton-1dodI:=+infinitive;d0:=0;forI:=1ton-1doforj:=1tomdo枚举每一条边ifdxj+tjdyjthe

12、ndyj:=dxj+tj;forI:=1tomdoifdxj+tjdyjthenreturnfalseelsereturntrue;end;10.第n最短路径问题*第二最短路径:每举最短路径上的每条边,每次删除一条,然后求新图的最短路径,取这些路径中最短的一条即为第二最短路径。*同理,第n最短路径可在求解第n-1最短路径的基础上求解。color=#0000FF三、背包问题/color数据结构:wi:第i个背包的重量;pi:第i个背包的价值;1.0-1背包:每个背包只能使用一次或有限次(可转化为一次):A.求最多可放入的重量。NOIP2001装箱问题有一个箱子容量为v(正整数,ovv20000)

13、同时有n个物品(o玄nV30)每个物品有一个体积(正整数)。要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。l搜索方法proceduresearch(k,v:integer);搜索第k个物品,剩余空间为vvari,j:integer;beginifv=bestthenexit;sn为前n个物品的重量和ifkwkthensearch(k+1,v-wk);search(k+1,v);end;end;lDPFI,j为前i个物品中选择若干个放入使其体积正好为j的标志,为布尔型。实现:将最优化问题转化为判定性问题*部分背包问题可有贪心法求解:计算Pi/WifI,j=fi-1,j-wi(wI

14、=j0thenifj+now=ntheninc(cj+now,aj);a:=c;end;边界:f0,0:=true.2.可重复背包A求最多可放入的重量。FI,j为前i个物品中选择若干个放入使其体积正好为j的标志,为布尔型。状态转移方程为fI,j=fI-1,j-wI*k(k=1.jdivwI)B.求可以放入的最大价值。USACO1.2ScoreInflation进行一次竞赛,总时间T固定,有若干种可选择的题目,每种题目可选入的数量不限,每种题目有一个ti(解答此题所需的时间)和一个si(解答此题所得的分数),现要选择若干题目,使解这些题的总时间在T以内的前提下,所得的总分最大,求最大的得分。*易

15、想到:fi,j=maxfi-k*wj,j-1+k*pj(0=k=0ThenBegint:=problemj.point+fi-problemj.time;IftfiThenfi:=t;End;Writeln(fM);End.C.求恰好装满的情况数。Ahoi2001Problem2求自然数n本质不同的质数和的表达式的数目。思路一,生成每个质数的系数的排列,在一一测试,这是通法。proceduretry(dep:integer);vari,j:integer;begincal;此过程计算当前系数的计算结果,now为结果ifnownthenexit;剪枝ifdep=l+1thenbegin生成所有系

16、数cal;ifnow=ntheninc(tot);exit;end;fori:=0tondivprdepdobeginxsdep:=i;try(dep+1);xsdep:=0;end;end;思路二,递归搜索效率较高proceduretry(dep,rest:integer);vari,j,x:integer;beginif(rest0thenfork:=1tondivnowdoifj+now*k=ntheninc(cj+now*k,aj);a:=c;end;mainbeginread(now);读入第一个物品的重量i:=0;ai为背包容量为i时的放法总数whilei=ndobeginai:=

17、1;inc(i,now);end;定义第一个物品重白整数倍的重量a值为1,作为初值fori:=2tovdobeginread(now);update;动态更新end;writeln(an);四、排序算法1.快速排序:procedureqsort(l,r:integer);vari,j,mid:integer;begini:=l;j:=r;mid:=a(l+r)div2;将当前序列在中间位置的数定义为中间数repeatwhileaimiddodec(j);在右半部分寻找比中间数小的数ifij;ifljthenqsort(l,j);若未到两个数的边界,则递归搜索左右区间ifirthenqsort(

18、i,r);end;sortB.插入排序:思路:当前a1.ai-1已排好序了,现要插入ai使a1.ai有序。procedureinsert_sort;vari,j:integer;beginfori:=2tondobegina0:=ai;j:=i-1;whilea0ajthenswap(ai,aj);end;D.冒泡排序procedurebubble_sort;vari,j,k:integer;beginfori:=1ton-1doforj:=ndowntoi+1doifajaj-1thenswap(aj,aj-1);每次比较相邻元素的关系end;E.堆排序:proceduresift(i,m:

19、integer);调整以i为根的子树成为堆,m为结点总数vark:integer;begina0:=ai;k:=2*i;在完全二叉树中结点i的左孩子为2*i,右孩子为2*i+1whilek=mdobeginif(km)and(akak+1)theninc(k);找出ak与ak+1中较大值ifa0akthenbeginai:=ak;i:=k;k:=2*i;elsek:=m+1;end;ai:=a0;将根放在合适的位置end;endprocedureheapsort;varj:integer;beginforj:=ndiv2downto1dosift(j,n);forj:=ndownto2dobe

20、ginswap(a1,aj);sift(1,j-1);end;end;F.归并排序a为序列表,tmp为辅助数组proceduremerge(vara:listtype;p,q,r:integer);将已排序好的子序列ap.q与aq+1.r合并为有序的tmpp.rvarI,j,t:integer;tmp:listtype;begint:=p;i:=p;j:=q+1;t为tmp指针,I,j分别为左右子序列的指针while(t=r)dobeginif(ir)or(ai=aj)满足取左边序列当前元素的要求thenbeginendelsebegintmpt:=aj;inc(j);end;inc(t);e

21、nd;fori:=ptordoai:=tmpi;end;mergeproceduremerge_sort(vara:listtype;p,r:integer);合并并F序ap.rvarq:integer;beginifprthenbeginq:=(p+r-1)div2;merge_sort(a,p,q);merge_sort(a,q+1,r);merge(a,p,q,r);end;end;mainbeginmerge_sort(a,1,n);end.G.基数排序思想:对每个元素按从低位到高位对每一位进行一次排序五、高精度计算高精度数的定义:typehp=array1.maxlenofinteg

22、er;1.高精度加法procedureplus(a,b:hp;varc:hp);vari,len:integer;beginfillchar(c,sizeof(c),0);ifa0b0thenlen:=a0elselen:=b0;fori:=1tolendobegininc(ci,ai+bi);ifci10thenbegindec(ci,10);inc(ci+1);end;进位end;ifclen+10theninc(len);c0:=len;end;plus2.高精度减法proceduresubstract(a,b:hp;varc:hp);vari,len:integer;beginfill

23、char(c,sizeof(c),0);ifa0b0thenlen:=a0elselen:=b0;fori:=1tolendobegininc(ci,ai-bi);ifci1)and(clen=0)dodec(len);c0:=len;end;3.高精度乘以低精度proceduremultiply(a:hp;b:longint;varc:hp);vari,len:integer;beginfillchar(c,sizeof(c),0);len:=a0;fori:=1tolendobegininc(ci,ai*b);inc(ci+1,(ai*b)div10);ci:=cimod10;end;in

24、c(len);while(clen=10)dobegin处理最高位的进位clen+1:=clendiv10;clen:=clenmod10;dodec(len);若不需进位则调整lenc0:=len;end;multiply4.高精度乘以高精度procedurehigh_multiply(a,b:hp;varc:hpvari,j,len:integer;beginfillchar(c,sizeof(c),0);fori:=1toa0doforj:=1tob0dobegininc(ci+j-1,ai*bj);inc(ci+j,ci+j-1div10);ci+j-1:=ci+j-1mod10;en

25、d;len:=a0+b0+1;while(len1)and(clen=0)dodec(len);c0:=len;end;5.高精度除以低精度proceduredevide(a:hp;b:longint;c:=adivb;d:=amodbvari,len:integer;beginfillchar(c,sizeof(c),0);len:=a0;d:=0;fori:=lendownto1dobegind:=d*10+ai;ci:=ddivb;d:=dmodb;end;inc(len);end;while(len1)and(clen=0)varc:hp;vard:longint);while(len

26、1)and(clen=0)thendec(len);c0:=len;end;6.高精度除以高精度procedurehigh_devide(a,b:hp;varc,d:hp);vari,len:integer;beginfillchar(c,sizeof(c),0);fillchar(d,sizeof(d),0);len:=a0;d0:=1;fori:=lendownto1dobeginmultiply(d,10,d);d1:=ai;while(compare(d,b)=0)do即d=bbeginSubtract(d,b,d);inc(ci);end;end;while(len1)and(c.s

27、len=0)dodec(len);c.len:=len;end;六、树的遍历1.已知前序中序求后序procedureSolve(pre,mid:string);vari:integer;beginif(pre=“)or(mid=“)thenexit;i:=pos(pre1,mid);solve(copy(pre,2,i),copy(mid,1,i-1);solve(copy(pre,i+1,length(pre)-i),copy(mid,i+1,length(mid)-i);post:=post+pre1;加上根,递3结束后post即为后序遍历end;2.已知中序后序求前序procedureS

28、olve(mid,post:string);vari:integer;beginif(mid=“)or(post=“)thenexit;i:=pos(postlength(post),mid);pre:=pre+postlength(post);加上根,递3结束后pre即为前序遍历solve(copy(mid,1,I-1),copy(post,1,I-1);solve(copy(mid,I+1,length(mid)-I),copy(post,I,length(post)-i);end;3.已知前序后序求中序的一种functionok(s1,s2:string):boolean;vari,l:

29、integer;p:boolean;beginok:=true;l:=length(s1);fori:=1toldobeginp:=false;forj:=1toldoifs1i=s2jthenp:=true;ifnotpthenbeginok:=false;exit;end;end;end;proceduresolve(pre,post:string);vari:integer;beginif(pre=)or(post=M)thenexit;i:=0;repeatinc(i);untilok(copy(pre,2,i),copy(post,1,i);solve(copy(pre,2,i),c

30、opy(post,1,i);midstr:=midstr+pre1;solve(copy(pre,i+2,length(pre)-i-1),copy(post,i+1,length(post)-i-1);end;七进制转换1.任意正整数进制间的互化除n取余2.实数任意正整数进制间的互化乘n取整3.负数进制:八全排列与组合的生成设计一个程序,读入一个十进制数的基数和一个负进制数的基数,并将此十进制数转换为此负进制下白数:-R-2,-3,-4,.-201.排列的生成:(1.n)proceduresolve(dep:integer);vari:integer;beginifdep=n+1thenbe

31、ginwriteln(s);exit;end;fori:=1tondoifnotusedithenbegins:=s+chr(i+ord(0);usedi:=true;solve(dep+1);s:=copy(s,1,length(s)-1);usedi:=false;end;end;2.组合的生成(1.n中选取k个数的所有方案)proceduresolve(dep,pre:integer);vari:integer;beginifdep=k+1thenbeginwriteln(s);exit;end;fori:=1tondoif(notusedi)and(ipre)thenbegins:=s

32、+chr(i+ord(0);usedi:=true;solve(dep+1,i);s:=copy(s,1,length(s)-1);usedi:=false;end;end;九.查找算法1.折半查找functionbinsearch(k:keytype):integer;varlow,hig,mid:integer;beginlow:=1;hig:=n;mid:=(low+hig)div2;while(amid.keyk)and(lowkthenhig:=mid-1elselow:=mid+1;mid:=(low+hig)div2;end;iflowhigthenmid:=0;binsearc

33、h:=mid;end;2.树形查找二叉排序树:每个结点的值都大于其左子树任一结点的值而小于其右子树任一结点的值。查找functiontreesrh(k:keytype):pointer;varq:pointer;beginq:=root;while(qnil)and(qA.keyk)doifkqA.keythenq:=qA.leftelseq:=qA.right;treesrh:=q;end;十、贪心*会议问题(1)n个活动每个活动有一个开始时间和一个结束时间,任一时刻仅一项活动进行,求满足活动数最多的情况。解:按每项活动的结束时间进行排序,排在前面的优先满足。(2)会议室空闲时间最少。(3)

34、每个客户有一个愿付的租金,求最大利润。(4)共R间会议室,第i个客户需使用i间会议室,费用相同,求最大利润。十一、回溯法框架1.n皇后问题proceduretry(i:byte);varj:byte;beginifi=n+1thenbeginprint;exit;end;forj:=1tondoifaiandbj+iandcj-ithenbeginxi:=j;aj:=false;bj+i:=false;cj-i:=false;try(i+1);aj:=true;bi+j:=true;cj-i:=true;end;end;2.HanoiTower汉诺塔h(n)=2*h(n-1)+1h(1)=1初

35、始所有铜片都在a柱上procedurehanoi(n,a,b,c:byte);将第n块铜片从a柱通过b柱移到c柱上beginifn=0thenexit;hanoi(n-1,a,c,b);将上面的n-1块从a柱通过c柱移到b柱上write(n,movedm,a,c);to,hanoi(n-1,b,a,c);将b上白nn-1块从b柱通过a柱移到c柱上end;初始铜片分布在3个柱上,给定目标柱goalh1.3,0.n存放三个柱的状态,now与nowp存最大的不到位的铜片的柱号和编号,hI,0存第I个柱上的个数。Proceduremove(k,goal:integer);将最大不到位的k移至目标柱goal上BeginIfk=0thenexit;ForI:=1to3doForj:=1tohanI,0doIfhI,j=kthenbeg

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论