导航:首页 > 源码编译 > 算法大全

算法大全

发布时间:2022-02-24 12:22:53

Ⅰ C语言算法有哪些 并举例和分析

算法大全(C,C++)
一、 数论算法

1.求两数的最大公约数
function gcd(a,b:integer):integer;
begin
if b=0 then gcd:=a
else gcd:=gcd (b,a mod b);
end ;

2.求两数的最小公倍数
function lcm(a,b:integer):integer;
begin
if a<b then swap(a,b);
lcm:=a;
while lcm mod b>0 do inc(lcm,a);
end;

3.素数的求法
A.小范围内判断一个数是否为质数:
function prime (n: integer): Boolean;
var I: integer;
begin
for I:=2 to trunc(sqrt(n)) do
if n mod I=0 then begin
prime:=false; exit;
end;
prime:=true;
end;

B.判断longint范围内的数是否为素数(包含求50000以内的素数表):
procere getprime;
var
i,j:longint;
p:array[1..50000] of boolean;
begin
fillchar(p,sizeof(p),true);
p[1]:=false;
i:=2;
while i<50000 do begin
if p[i] then begin
j:=i*2;
while j<50000 do begin
p[j]:=false;
inc(j,i);
end;
end;
inc(i);
end;
l:=0;
for i:=1 to 50000 do
if p[i] then begin
inc(l);pr[l]:=i;
end;
end;{getprime}

function prime(x:longint):integer;
var i:integer;
begin
prime:=false;
for i:=1 to l do
if pr[i]>=x then break
else if x mod pr[i]=0 then exit;
prime:=true;
end;{prime}

二、图论算法

1.最小生成树

A.Prim算法:

procere prim(v0:integer);
var
lowcost,closest:array[1..maxn] of integer;
i,j,k,min:integer;
begin
for i:=1 to n do begin
lowcost[i]:=cost[v0,i];
closest[i]:=v0;
end;
for i:=1 to n-1 do begin
{寻找离生成树最近的未加入顶点k}
min:=maxlongint;
for j:=1 to n do
if (lowcost[j]<min) and (lowcost[j]<>0) then begin
min:=lowcost[j];
k:=j;
end;
lowcost[k]:=0; {将顶点k加入生成树}
{生成树中增加一条新的边k到closest[k]}
{修正各点的lowcost和closest值}
for j:=1 to n do
if cost[k,j]<lwocost[j] then begin
lowcost[j]:=cost[k,j];
closest[j]:=k;
end;
end;
end;{prim}

B.Kruskal算法:(贪心)

按权值递增顺序删去图中的边,若不形成回路则将此边加入最小生成树。
function find(v:integer):integer; {返回顶点v所在的集合}
var i:integer;
begin
i:=1;
while (i<=n) and (not v in vset[i]) do inc(i);
if i<=n then find:=i else find:=0;
end;

procere kruskal;
var
tot,i,j:integer;
begin
for i:=1 to n do vset[i]:=[i];{初始化定义n个集合,第I个集合包含一个元素I}
p:=n-1; q:=1; tot:=0; {p为尚待加入的边数,q为边集指针}
sort;
{对所有边按权值递增排序,存于e[I]中,e[I].v1与e[I].v2为边I所连接的两个顶点的序号,e[I].len为第I条边的长度}
while p>0 do begin
i:=find(e[q].v1);j:=find(e[q].v2);
if i<>j then begin
inc(tot,e[q].len);
vset[i]:=vset[i]+vset[j];vset[j]:=[];
dec(p);
end;
inc(q);
end;
writeln(tot);
end;

2.最短路径

A.标号法求解单源点最短路径:
var
a:array[1..maxn,1..maxn] of integer;
b:array[1..maxn] of integer; {b[i]指顶点i到源点的最短路径}
mark:array[1..maxn] of boolean;

procere bhf;
var
best,best_j:integer;
begin
fillchar(mark,sizeof(mark),false);
mark[1]:=true; b[1]:=0;{1为源点}
repeat
best:=0;
for i:=1 to n do
If mark[i] then {对每一个已计算出最短路径的点}
for j:=1 to n do
if (not mark[j]) and (a[i,j]>0) then
if (best=0) or (b[i]+a[i,j]<best) then begin
best:=b[i]+a[i,j]; best_j:=j;
end;
if best>0 then begin
b[best_j]:=best;mark[best_j]:=true;
end;
until best=0;
end;{bhf}

B.Floyed算法求解所有顶点对之间的最短路径:
procere floyed;
begin
for I:=1 to n do
for j:=1 to n do
if a[I,j]>0 then p[I,j]:=I else p[I,j]:=0; {p[I,j]表示I到j的最短路径上j的前驱结点}
for k:=1 to n do {枚举中间结点}
for i:=1 to n do
for j:=1 to n do
if a[i,k]+a[j,k]<a[i,j] then begin
a[i,j]:=a[i,k]+a[k,j];
p[I,j]:=p[k,j];
end;
end;

C. Dijkstra 算法:

var
a:array[1..maxn,1..maxn] of integer;
b,pre:array[1..maxn] of integer; {pre[i]指最短路径上I的前驱结点}
mark:array[1..maxn] of boolean;
procere dijkstra(v0:integer);
begin
fillchar(mark,sizeof(mark),false);
for i:=1 to n do begin
d[i]:=a[v0,i];
if d[i]<>0 then pre[i]:=v0 else pre[i]:=0;
end;
mark[v0]:=true;
repeat {每循环一次加入一个离1集合最近的结点并调整其他结点的参数}
min:=maxint; u:=0; {u记录离1集合最近的结点}
for i:=1 to n do
if (not mark[i]) and (d[i]<min) then begin
u:=i; min:=d[i];
end;
if u<>0 then begin
mark[u]:=true;
for i:=1 to n do
if (not mark[i]) and (a[u,i]+d[u]<d[i]) then begin
d[i]:=a[u,i]+d[u];
pre[i]:=u;
end;
end;
until u=0;
end;

3.计算图的传递闭包

Procere Longlink;
Var
T:array[1..maxn,1..maxn] of boolean;
Begin
Fillchar(t,sizeof(t),false);
For k:=1 to n do
For I:=1 to n do
For j:=1 to n do T[I,j]:=t[I,j] or (t[I,k] and t[k,j]);
End;

4.无向图的连通分量

A.深度优先
procere dfs ( now,color: integer);
begin
for i:=1 to n do
if a[now,i] and c[i]=0 then begin {对结点I染色}
c[i]:=color;
dfs(I,color);
end;
end;

B 宽度优先(种子染色法)

5.关键路径

几个定义: 顶点1为源点,n为汇点。
a. 顶点事件最早发生时间Ve[j], Ve [j] = max{ Ve [j] + w[I,j] },其中Ve (1) = 0;
b. 顶点事件最晚发生时间 Vl[j], Vl [j] = min{ Vl[j] – w[I,j] },其中 Vl(n) = Ve(n);
c. 边活动最早开始时间 Ee[I], 若边I由<j,k>表示,则Ee[I] = Ve[j];
d. 边活动最晚开始时间 El[I], 若边I由<j,k>表示,则El[I] = Vl[k] – w[j,k];
若 Ee[j] = El[j] ,则活动j为关键活动,由关键活动组成的路径为关键路径。
求解方法:
a. 从源点起topsort,判断是否有回路并计算Ve;
b. 从汇点起topsort,求Vl;
c. 算Ee 和 El;

6.拓扑排序

找入度为0的点,删去与其相连的所有边,不断重复这一过程。
例 寻找一数列,其中任意连续p项之和为正,任意q 项之和为负,若不存在则输出NO.

7.回路问题

Euler回路(DFS)
定义:经过图的每条边仅一次的回路。(充要条件:图连同且无奇点)

Hamilton回路
定义:经过图的每个顶点仅一次的回路。

一笔画
充要条件:图连通且奇点个数为0个或2个。

9.判断图中是否有负权回路 Bellman-ford 算法

x[I],y[I],t[I]分别表示第I条边的起点,终点和权。共n个结点和m条边。
procere bellman-ford
begin
for I:=0 to n-1 do d[I]:=+infinitive;
d[0]:=0;
for I:=1 to n-1 do
for j:=1 to m do {枚举每一条边}
if d[x[j]]+t[j]<d[y[j]] then d[y[j]]:=d[x[j]]+t[j];
for I:=1 to m do
if d[x[j]]+t[j]<d[y[j]] then return false else return true;
end;

10.第n最短路径问题

*第二最短路径:每举最短路径上的每条边,每次删除一条,然后求新图的最短路径,取这些路径中最短的一条即为第二最短路径。
*同理,第n最短路径可在求解第n-1最短路径的基础上求解。

三、背包问题

*部分背包问题可有贪心法求解:计算Pi/Wi
数据结构:
w[i]:第i个背包的重量;
p[i]:第i个背包的价值;

1.0-1背包: 每个背包只能使用一次或有限次(可转化为一次):

A.求最多可放入的重量。
NOIP2001 装箱问题
有一个箱子容量为v(正整数,o≤v≤20000),同时有n个物品(o≤n≤30),每个物品有一个体积 (正整数)。要求从 n 个物品中,任取若千个装入箱内,使箱子的剩余空间为最小。
l 搜索方法
procere search(k,v:integer); {搜索第k个物品,剩余空间为v}
var i,j:integer;
begin
if v<best then best:=v;
if v-(s[n]-s[k-1])>=best then exit; {s[n]为前n个物品的重量和}
if k<=n then begin
if v>w[k] then search(k+1,v-w[k]);
search(k+1,v);
end;
end;

l DP
F[I,j]为前i个物品中选择若干个放入使其体积正好为j的标志,为布尔型。
实现:将最优化问题转化为判定性问题
f [I, j] = f [ i-1, j-w[i] ] (w[I]<=j<=v) 边界:f[0,0]:=true.
For I:=1 to n do
For j:=w[I] to v do F[I,j]:=f[I-1,j-w[I]];
优化:当前状态只与前一阶段状态有关,可降至一维。
F[0]:=true;
For I:=1 to n do begin
F1:=f;
For j:=w[I] to v do
If f[j-w[I]] then f1[j]:=true;
F:=f1;
End;

B.求可以放入的最大价值。
F[I,j] 为容量为I时取前j个背包所能获得的最大价值。
F [i,j] = max { f [ i – w [ j ], j-1] + p [ j ], f[ i,j-1] }

C.求恰好装满的情况数。
DP:
Procere update;
var j,k:integer;
begin
c:=a;
for j:=0 to n do
if a[j]>0 then
if j+now<=n then inc(c[j+now],a[j]);
a:=c;
end;

2.可重复背包

A求最多可放入的重量。
F[I,j]为前i个物品中选择若干个放入使其体积正好为j的标志,为布尔型。
状态转移方程为
f[I,j] = f [ I-1, j – w[I]*k ] (k=1.. j div w[I])

B.求可以放入的最大价值。
USACO 1.2 Score Inflation
进行一次竞赛,总时间T固定,有若干种可选择的题目,每种题目可选入的数量不限,每种题目有一个ti(解答此题所需的时间)和一个si(解答此题所得的分数),现要选择若干题目,使解这些题的总时间在T以内的前提下,所得的总分最大,求最大的得分。
*易想到:
f[i,j] = max { f [i- k*w[j], j-1] + k*p[j] } (0<=k<= i div w[j])
其中f[i,j]表示容量为i时取前j种背包所能达到的最大值。
*实现:
Begin
FillChar(f,SizeOf(f),0);
For i:=1 To M Do
For j:=1 To N Do
If i-problem[j].time>=0 Then
Begin
t:=problem[j].point+f[i-problem[j].time];
If t>f[i] Then f[i]:=t;
End;
Writeln(f[M]);
End.

C.求恰好装满的情况数。
Ahoi2001 Problem2
求自然数n本质不同的质数和的表达式的数目。
思路一,生成每个质数的系数的排列,在一一测试,这是通法。
procere try(dep:integer);
var i,j:integer;
begin
cal; {此过程计算当前系数的计算结果,now为结果}
if now>n then exit; {剪枝}
if dep=l+1 then begin {生成所有系数}
cal;
if now=n then inc(tot);
exit;
end;
for i:=0 to n div pr[dep] do begin
xs[dep]:=i;
try(dep+1);
xs[dep]:=0;
end;
end;

思路二,递归搜索效率较高
procere try(dep,rest:integer);
var i,j,x:integer;
begin
if (rest<=0) or (dep=l+1) then begin
if rest=0 then inc(tot);
exit;
end;
for i:=0 to rest div pr[dep] do
try(dep+1,rest-pr[dep]*i);
end;
{main: try(1,n); }

思路三:可使用动态规划求解
USACO1.2 money system
V个物品,背包容量为n,求放法总数。
转移方程:

Procere update;
var j,k:integer;
begin
c:=a;
for j:=0 to n do
if a[j]>0 then
for k:=1 to n div now do
if j+now*k<=n then inc(c[j+now*k],a[j]);
a:=c;
end;
{main}
begin
read(now); {读入第一个物品的重量}
i:=0; {a[i]为背包容量为i时的放法总数}
while i<=n do begin
a[i]:=1; inc(i,now); end; {定义第一个物品重的整数倍的重量a值为1,作为初值}
for i:=2 to v do
begin
read(now);
update; {动态更新}
end;
writeln(a[n]);

四、排序算法

A.快速排序:

procere qsort(l,r:integer);
var i,j,mid:integer;
begin
i:=l;j:=r; mid:=a[(l+r) div 2]; {将当前序列在中间位置的数定义为中间数}
repeat
while a[i]<mid do inc(i); {在左半部分寻找比中间数大的数}
while a[j]>mid do dec(j);{在右半部分寻找比中间数小的数}
if i<=j then begin {若找到一组与排序目标不一致的数对则交换它们}
swap(a[i],a[j]);
inc(i);dec(j); {继续找}
end;
until i>j;
if l<j then qsort(l,j); {若未到两个数的边界,则递归搜索左右区间}
if i<r then qsort(i,r);
end;{sort}

B.插入排序:

思路:当前a[1]..a[i-1]已排好序了,现要插入a[i]使a[1]..a[i]有序。
procere insert_sort;
var i,j:integer;
begin
for i:=2 to n do begin
a[0]:=a[i];
j:=i-1;
while a[0]<a[j] do begin
a[j+1]:=a[j];
j:=j-1;
end;
a[j+1]:=a[0];
end;
end;{inset_sort}

C.选择排序:
procere sort;
var i,j,k:integer;
begin
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]>a[j] then swap(a[i],a[j]);
end;

D. 冒泡排序
procere bubble_sort;
var i,j,k:integer;
begin
for i:=1 to n-1 do
for j:=n downto i+1 do
if a[j]<a[j-1] then swap( a[j],a[j-1]); {每次比较相邻元素的关系}
end;

E.堆排序:
procere sift(i,m:integer);{调整以i为根的子树成为堆,m为结点总数}
var k:integer;
begin
a[0]:=a[i]; k:=2*i;{在完全二叉树中结点i的左孩子为2*i,右孩子为2*i+1}
while k<=m do begin
if (k<m) and (a[k]<a[k+1]) then inc(k);{找出a[k]与a[k+1]中较大值}
if a[0]<a[k] then begin a[i]:=a[k];i:=k;k:=2*i; end
else k:=m+1;
end;
a[i]:=a[0]; {将根放在合适的位置}
end;

procere heapsort;
var
j:integer;
begin
for j:=n div 2 downto 1 do sift(j,n);
for j:=n downto 2 do begin
swap(a[1],a[j]);
sift(1,j-1);
end;

Ⅱ 在我国明代数学家吴敬所着的《九章算术比类算法大全》中,有一道数题学题叫“宝塔装灯”,内容为“远望巍

设垫层为x盏灯
x+2x+4x+8x+16x+32x+64x=381
(1+2+4+8+16+32+64)x=381
127x=381

x=3
顶层有3盏灯

Ⅲ matlab算法大全,谁有

网页链接

这个吗

Ⅳ C51中的算法大全

指的是哪方面?C51程序一般以外接硬件为基础,如纯数据处理或实现CRC、PID等算法可以查看相应资料。

Ⅳ 求汕尾海丰麻将算法大全 越全越好

好像是这样,鸡糊2支1,自摸4支4,小一色对对糊,糊就6支3,自摸8支8,大一色糊10支5,自摸12支12,十三幺 天湖 地胡 大三元,大四喜。糊2底1,自摸2底2。小三元、小四喜糊就是12支6,自摸就是14支14。如果碰.东南西北中发白或者自己摸三只,一个风位算一方,如果刚刚好是自己的风位算两方,码字太难教了

Ⅵ 24算法大全101072

(2*(7+10))-10
(2*(7+10))-10
(2-10)*(7-10)
(2*(10+7))-10
(2-10)*(7-10)
(2*(10+7))-10
(7-10)*(2-10)
((7+10)*2)-10
(7-10)*(2-10)
((7+10)*2)-10
(10-2)*(10-7)
((10+7)*2)-10
(10-7)*(10-2)
(10-2)*(10-7)
((10+7)*2)-10
(10-7)*(10-2)

Ⅶ 数学建模的算法大全谁有给发一份

望采纳

Ⅷ 经典算法大全 需要用什么软件编写才能运行

一般情况算法都可以使用C语言相关软件运行devc++ - eclipse - codeblocks - codelite - notepad++ - ultraedit - jdk vs2013等

Ⅸ 百度算法有哪些百度算法大全谁有

网络细雨算法:

打击联系方式重复穿插,标题关键词堆砌,以及假冒官方网站等网站行为。算法自2018年7月中旬上线。

网络烽火算法2.0:

打击网站JS代码搜索引擎劫持,网民用户一旦点入劫持网站,便会跳转至仿网络虚假网站,陷入搜索死循环之中,搜索到的结果都是劫持的信息,而且用户如果使用手机访问网站还会被"套电"获取用户的手机号码或QQ号码等隐私信息行为。算法自2018年5月17日上线。

网络清风算法2.0:

针对下载信息资源不准确、下载信息失效等行为,严重违规网站可受到永久封禁的惩罚。算法自2018年7月19日上线。

网络惊雷算法:

针对一些网站恶意点刷网站来提高网站排名的行为,包括人为恶意点击和利用VPN软件点刷网站流量等行为,严重为规则会长期封禁网站收录,算法自2017年11月20日上线。

网络闪电算法:

手机网站首页打开时间缓慢会影响网站排名,在打开时间方面,两秒之内网站可提高权重和一定的流量,两秒到三秒之间权重和流量不变,超过三秒以上的时间网站会被减低权重和降低流量。算法自2017年10月19日上线。

网络清风算法:

主要打击网页标题内容虚假、关键词堆砌、假冒的官方网站等行为,浪费用户浏览时间和骗取流量点击。算法自2017年9月14日上线。

网络蜘蛛升级https抓取:

网络建议网站流量开启CDN,网站协议转为https访问,对https协议的网站网络会提高一定的网站权重、抓取力度和排名优先的待遇。算法自2017年8月30日上线。

网络飓风算法:

重点打击采集网站、镜像网站和一些网页内容重复,原创质量低的网站。从而给原创网站提供更多的展现机会,而采集站或镜像站则会受到收录降低和排名下降的惩罚,算法自2017年7月4日上线。

网络烽火计划:

主要打击手机端网站域名劫持,当用移动设备访问网站时,再返回搜索结果页时,网页JS会强制跳转至虚假的网络搜索页,展现的都是第一次点击网站展现的信息。算法自2017年2月23日上线。

网络蓝天算法:

重点打击买卖软文的网站,包括新闻源和其他一些高权重网站,违规网站会受到降低权重排名。算法自2016年11月21日上线。

网络冰桶算法4.5:

重点打击色情类、赌博类等诱导类吸引眼球的非法广告页面,算法自2016年10月26日上线。

冰桶算法4.0:

重点打击移动端网站的广告,如广告弹窗、广告覆盖屏幕比例较多影响访客浏览的行为,会降低网站的权重和流量。算法自2016年9月19日上线。

网络天网算法:

重点打击网站JS代码恶意套取用户隐私信息,如套电手机号、QQ号等行为,网站清理掉违规JS可解除网络惩罚。算法自2016年8月10日上线。

网络冰桶算法3.0:

打击阻断用户访问页面时,强制弹窗胁迫用户下载APP才能继续浏览或使用的行为。算法自2016年7月15日上线。

网络冰桶算法2.0:

重点打击移动端手机广告遮挡屏幕浏览或强制客户登陆才能继续使用的行为。算法自2014年11月18日上线。

网络冰桶算法1.0:

重点打击移动端网站强行用户下载APP、登陆才能继续使用和大面积的广告覆盖行为,影响用户的浏览体验。算法自2014年8月30日上线。

网络绿箩算法2.0:

重点打击垃圾软件的站点和软文中带有不相关或大量的外链的站点。算法自2013年7月1日上线。

网络石榴算法:

重点打击站点网页含有大量的、恶劣的、低质量的广告行为,特别是反复的弹窗广告。算法自2013年5月17日上线。

网络绿箩算法:

主要打击网站与网站之间买卖链接的行为来提高网站权重和排名,包括买方、卖方和中介的网站。算法自2013年2月19日上线。

可以点击链接,查看更多帮助。

Ⅹ 24算法大全101037

3*(7+(10/10))
3*(7+(10/10))
3*((10/10)+7)
3*((10/10)+7)
7-((3-10)-10)
(7-(3-10))+10
7-(3-(10+10))
((7-3)+10)+10
(7-3)+(10+10)
7-((3-10)-10)
(7-(3-10))+10
7-(3-(10+10))
((7-3)+10)+10
(7-3)+(10+10)
7+(10-(3-10))
(7+10)-(3-10)
((7+10)-3)+10
7+((10-3)+10)
(7+(10-3))+10
((7+10)+10)-3
7+((10+10)-3)
(7+(10+10))-3
7+(10+(10-3))
(7+10)+(10-3)
(7+(10/10))*3
7+(10-(3-10))
(7+10)-(3-10)
((7+10)-3)+10
7+((10-3)+10)
(7+(10-3))+10
((7+10)+10)-3
7+((10+10)-3)
(7+(10+10))-3
7+(10+(10-3))
(7+10)+(10-3)
(7+(10/10))*3
10-((3-7)-10)
(10-(3-7))+10
10-(3-(7+10))
((10-3)+7)+10
(10-3)+(7+10)
10-((3-10)-7)
(10-(3-10))+7
10-(3-(10+7))
((10-3)+10)+7
(10-3)+(10+7)
10+(7-(3-10))
(10+7)-(3-10)
((10+7)-3)+10
10+((7-3)+10)
(10+(7-3))+10
((10+7)+10)-3
10+((7+10)-3)
(10+(7+10))-3
10+(7+(10-3))
(10+7)+(10-3)
10+(10-(3-7))
(10+10)-(3-7)
((10+10)-3)+7
10+((10-3)+7)
(10+(10-3))+7
((10+10)+7)-3
10+((10+7)-3)
(10+(10+7))-3
10+(10+(7-3))
(10+10)+(7-3)
((10/10)+7)*3
10-((3-7)-10)
(10-(3-7))+10
10-(3-(7+10))
((10-3)+7)+10
(10-3)+(7+10)
10-((3-10)-7)
(10-(3-10))+7
10-(3-(10+7))
((10-3)+10)+7
(10-3)+(10+7)
10+(7-(3-10))
(10+7)-(3-10)
((10+7)-3)+10
10+((7-3)+10)
(10+(7-3))+10
((10+7)+10)-3
10+((7+10)-3)
(10+(7+10))-3
10+(7+(10-3))
(10+7)+(10-3)
10+(10-(3-7))
(10+10)-(3-7)
((10+10)-3)+7
10+((10-3)+7)
(10+(10-3))+7
((10+10)+7)-3
10+((10+7)-3)
(10+(10+7))-3
10+(10+(7-3))
(10+10)+(7-3)
((10/10)+7)*3

阅读全文

与算法大全相关的资料

热点内容
笔记本没串口怎么写单片机程序 浏览:852
如何识别网站源码语言 浏览:393
javaweb首页 浏览:337
程序员招聘网站哪个好 浏览:576
ios仿美团外卖源码 浏览:138
pdf文本换行 浏览:426
爱豆app哪里下载 浏览:883
pac脚本怎么打开源码 浏览:551
安卓手机下载什么控制空调 浏览:92
如何把加密的pdf的水印去掉 浏览:907
已加密文件咋打印 浏览:429
机器人走正方形编程代码 浏览:125
安卓手机怎么变成苹果表情原创 浏览:673
serial驱动linux 浏览:845
高薪程序员有哪些专业 浏览:483
安安一对一聊天app在哪里下载 浏览:719
光遇攻略手册app在哪里下载 浏览:184
单片机ea引脚 浏览:814
中国移动app积分兑换商城在哪里 浏览:802
深圳儿童编程app 浏览:336