数学建模社区-数学中国

标题: 基本算法 [打印本页]

作者: smtg212    时间: 2005-6-23 12:38
标题: 基本算法

基本算法

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

求两数的最小公倍数
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;

素数的求法
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以内的素数表):
procedure 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 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 then
begin
inc(l);
pr[l]:=i;
end;
end;{getprime}

' m3 L- v- \; q- X; c1 H

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

2.

3.


4.求最小生成树
A.Prim算法:
procedure 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:=cost[v0,i];
closest:=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}

; j3 z1 Y$ `2 L, D1 ?) [

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

& A6 ^. y2 b& B$ o' X

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


作者: smtg212    时间: 2005-6-23 13:39
我要金币!!
作者: smtg212    时间: 2005-6-23 13:50

作者: pzwjn    时间: 2005-7-5 23:38

算法都是最基本的,这就能要金币吗?过2天我也弄几篇好文章来,哈.


作者: soulsoup_2001    时间: 2005-8-16 23:54
我顶[em02]
作者: oywf327    时间: 2005-8-17 11:12
顶一下
作者: 笑侠    时间: 2005-9-8 18:35
多谢了大大。
作者: zhaowu    时间: 2005-9-12 11:34
我1...
作者: wujunwei    时间: 2005-9-23 17:41
不错
作者: scbangbang    时间: 2006-11-2 05:02

这也为可不是个好方法!!


作者: lanhaide    时间: 2006-11-16 09:48
怎么都是pascal代码啊?谁能用C写一下呢?本人学C的
作者: gistree    时间: 2007-4-17 14:50
free啊,呼吁
作者: chaosjimmy    时间: 2007-4-17 22:38
我也来顶一个
作者: chaosjimmy    时间: 2007-4-17 22:39
在定一个就可以下载了
作者: zhouqing    时间: 2007-6-5 18:18
dddddddddddd
作者: chenhaotian    时间: 2007-9-1 18:02
fdsafdsafdsafdsafds
作者: future87    时间: 2009-2-28 17:00
谢谢分享!
作者: 443708933    时间: 2009-3-19 19:41
这是那个语言写的,和C很像啊
作者: crg511    时间: 2009-3-21 10:48
发了这个地方干嘛
作者: ganen    时间: 2009-5-17 16:15
这个挺好。。。。。




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5