4.归并排序
procedure merge;
var i,j,k:longint;
begin
i:=1;j:=1;k:=1;
while (i<=n)and(j<=m) do
if a[i]
else begin c[k]:=b[j];inc(j);inc(k); end;
while j<=m do begin c[k]:=b[j];inc(j);inc(k); end;
while i<=n do begin c[k]:=a[i];inc(i);inc(k); end;
end;
闰年
if (y mod 400=0) or((y mod 100<>0) and (y mod 4=0)) then y:=' 闰年';
高精度计算
1.高精度加法
function plus(a,b:ansistring):ansistring;
var
m,n:array[1..5000] of integer;
i,j:integer;
la,lb,len:integer;
begin
la:=length(a);
lb:=length(b);
fillchar(m,sizeof(m),0);
fillchar(n,sizeof(n),0);
for i:=1 to la do m[i]:=ord(a[la-i+1])-ord('0');
for i:=1 to lb do n[i]:=ord(b[lb-i+1])-ord('0');
if la>lb then
len:=la
else
len:=lb;
for i:=1 to len do
m[i]:=m[i]+n[i];
for i:=1 to len do
if m[i]>=10 then
begin
m[i+1]:=m[i+1]+m[i] div 10;
m[i]:=m[i] mod 10;
end;
plus:='';
j:=4500;
while m[j]=0 do dec(j);
for i:=j downto 1 do plus:=plus+chr(m[i]+ord('0')); end;
2.高精度减法
function substract(a,b:ansistring):ansistring;
var
m,n:array[1..5000] of integer;
i,j:integer;
la,lb,len:integer;
begin
la:=length(a);
lb:=length(b);
fillchar(m,sizeof(m),0);
fillchar(n,sizeof(n),0);
for i:=1 to la do m[i]:=ord(a[la-i+1])-ord('0');
for i:=1 to lb do n[i]:=ord(b[lb-i+1])-ord('0');
if la>lb then
len:=la
else
len:=lb;
for i:=1 to len do
if m[i]>=n[i] then
m[i]:=m[i]-n[i]
else
begin
m[i]:=m[i]+10-n[i];
m[i+1]:=m[i+1]-1;
end;
substract:='';
j:=4500;
while m[j]=0 do dec(j);
for i:=j downto 1 do substract:=substract+chr(m[i]+ord('0')); end;
3.高精度乘法
function multiply(a,b:string):string;
var
m,n,o:array[1..5000] of longint;
i,j,la,lb,x:longint;
begin
la:=length(a);
lb:=length(b);
fillchar(m,sizeof(m),0);
fillchar(n,sizeof(n),0);
fillchar(o,sizeof(o),0);
for i:=1 to la do m[i]:=ord(a[la-i+1])-48;
for i:=1 to lb do n[i]:=ord(b[lb-i+1])-48;
for i:=1 to la do
begin
x:=0;
for j:=1 to lb do
begin
o[i+j-1]:=m[i]*n[j]+x+o[i+j-1];
x:=o[i+j-1] div 10;
o[i+j-1]:=o[i+j-1] mod 10;
end;
o[i+j]:=x;
end;
multiply:='';
j:=4500;
while (o[j]=0) and(j>1) do dec(j);
for i:=j downto 1 do multiply:= multiply +chr(o[i]+48); end;
4.高精度除法
var x:longint;//余数
function devide(s:ansistring;n:longint):ansistring;
var
a,c:array[1..5000] of longint;
i,j,la:longint;
begin
fillchar(a,sizeof(a),0);
fillchar(c,sizeof(c),0);
la:=length(s);
for i:=1 to la do a[i]:=ord(s[i])-48;
x:=0;
for i:=1 to la do
begin
c[i]:=(a[i]+x*10) div n;
x:=(a[i]+x*10) mod n;
end;
j:=1;
devide:='';
while (c[j]=0)and(jfor i:=j to la do devide:= devide +chr(c[i]+48);
end;
0-1背包:
var
n,m,i,x:longint;
f:array[0..10000] of longint;
w,c:array[1..2000] of longint;
begin
fillchar(f,sizeof(f),0);//必须要
readln(m,n);//背包容量m物品数n
for i:=1 to n do readln(w[i],c[i]);//每个物品的重量w价值c
for i:=1 to n do
for x:=m downto w[i] do//注意downto
if f[x-w[i]]+c[i]>f[x] then f[x]:=f[x-w[i]]+c[i];//f(x)为重量不超过x的最大价值writeln(f[m]);//f(m)为最后的最优解
end.
折半查找
function binsearch(x,l,r:longint):longint;
var
m:longint;
begin
m:=(l+r) div 2;
if l>r then binsearch:=0
else
if a[m]=x then binsearch:=m
else
if x>a[m] then
binsearch:=binsearch(x,m+1,r)
else
binsearch:=binsearch(x,l,m-1);
end;