c算法大全
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、数论算法
1.求两数的最大公约数
function gcd(a,b:integer):intege r; begin
if b=0 then gcd:=a
else gcd:=gcd (b,a mod b); end ;
2.求两数的最小公倍数
function lcm(a,b:intege r):integer; begin
if a
lcm:=a;
w hile lcm mod b>0 do inc(lcm,a); end;
3.素数的求法
A.小范围内判断一个数是否为质数:function prime (n: intege r): Boolean; v ar 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以内的素数表):procedure getprime;
v ar
i,j:longint;
p:array[1..50000] of boolean;
begin
fillchar(p,sizeof(p),true);
p[1]:=false;
i:=2;
w hile i<50000 do begin
if p[i] then begin
j:=i*2;
w hile 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;
v ar i:integer;
begin
prime:=false;
for i:=1 to l do
if pr[i]>=x the n break
else if x mod pr[i]=0 then exit;
prime:=true;
end;{prime}
二、图论算法
1.最小生成树
A.Prim算法:
procedure prim(v0:integer);
v ar
low cost,closest:array[1..maxn] of integer; i,j,k,min:integer;
begin
for i:=1 to n do begin
low cost[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 (low cost[j]
min:=low cost[j];
k:=j;
end;
low cost[k]:=0; {将顶点k加入生成树}
{生成树中增加一条新的边k到closest[k]}
{修正各点的low cost和clo sest值}
for j:=1 to n do
if cost[k,j] low cost[j]:=cost[k,j]; closest[j]:=k; end; end; end;{prim} B.Kruskal算法:(贪心) 按权值递增顺序删去图中的边,若不形成回路则将此边加入最小生成树。 function find(v:integer):integer; {返回顶点v所在的集合} v ar i:integer; begin i:=1; w hile (i<=n) and (not v in v set[i]) do inc(i); if i<=n then find:=i else find:=0; end; procedure kruskal; v ar tot,i,j:integer; begin for i:=1 to n do v set[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条边的长度} w hile p>0 do begin i:=find(e[q].v1);j:=find(e[q].v2); if i<>j then begin inc(tot,e[q].len); v set[i]:=v set[i]+v set[j];v set[j]:=[]; dec(p); end; inc(q);