📄 close.pas
字号:
{$N+,R-}
var m,n,time:longint;
ch:char;
r:extended;
a,b,c,x,y,maxx,maxy,mina,minb,t:comp;
function gcd(x,y:comp):comp;
var z:comp;
begin
while y>0 do
begin
z:=y;
while x>=z do
begin
x:=x-z;
z:=z+z
end;
while z>y do
begin
z:=z/2;
if x>=z then x:=x-z
end;
z:=x;
x:=y;
y:=z
end;
gcd:=x
end;
function compdiv(x,y:comp):comp;
var z,b,t:comp;
begin
z:=0; b:=1; t:=y;
while x>=t do
begin
z:=z+b;
b:=b+b;
x:=x-t;
t:=t+t
end;
while t>y do
begin
t:=t/2;
b:=b/2;
if x>=t then begin x:=x-t;z:=z+b end
end;
compdiv:=z
end;
begin
time:=meml[$40:$6c];
assign(input,'close.in');
reset(input);
assign(output,'close.out');
rewrite(output);
readln(m,n);
r:=0; b:=1; a:=0;
read(ch);
while ch<>'.' do
begin
r:=r*10+ord(ch)-48;
a:=r;
read(ch)
end;
while not(eoln) do
begin
read(ch);
b:=b*10;
r:=r+(ord(ch)-48)/b;
a:=a*10+ord(ch)-48
end;
close(input);
c:=gcd(a,b);
a:=a/c;
b:=b/c;
if (a<=m) and (b<=n) then begin writeln(a:0:0,'/',b:0:0);close(output);halt end;
maxx:=compdiv(m*b,a);
if maxx=0 then begin writeln(m,'/1');close(output); halt end;
if maxx>n then maxx:=n;
a:=a-trunc(r)*b;
t:=a*maxx-trunc(a*maxx/b)*b;
if t<b-t then mina:=t else mina:=b-t;
minb:=maxx;
x:=maxx;
while x>1 do
begin
x:=x-1;
t:=t-a;
if t<0 then t:=t+b;
if t<b-t then c:=t else c:=b-t;
if c<mina then
if c*minb<=mina*x then begin mina:=c;minb:=x end
end;
mina:=trunc(minb*r);
if (r+r)*minb>mina+mina+1 then mina:=mina+1;
a:=a+b*trunc(r);
x:=a*minb-mina*b+a*minb; y:=b*minb;
c:=gcd(x,y);
x:=x/c; y:=y/c;
if (x<=m) and (y<=n)
then begin writeln('TOO MANY'); close(output);halt end;
writeln(mina/gcd(mina,minb):0:0,'/',minb/gcd(mina,minb):0:0);
close(output);
assign(output,'con');
rewrite(output);
writeln((meml[$40:$6c]-time)/18.2:0:2)
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -