當前位置:編程學習大全網 - 編程語言 - 埃及分數的算法解決

埃及分數的算法解決

題目

埃及分數

在古埃及,人們使用單位分數的和(形如 1/a 的,a 是自然數)表示壹切有理數。 如:

2/3=1/2+1/6,但不允許 2/3=1/3+1/3,因為加數中有相同的。 對於壹個分數 a/b,表示方

法有很多種,但是哪種最好呢?

首先,加數少的比加數多的好,其次,加數個數相同的,最小的分數越大越好。 如:

最好的是最後壹種,因為 1/18 比 1/180、1/45、1/30、1/180 都大。

輸入文件

給出兩個正整數 a、b(0 < a < b < 1000),編程計算對於分數 a/b 最好的表達方式。

輸出文件

若幹個數,自小到大排列,依次是單位分數的分母。

樣例輸入

19 45

樣例輸出

5 6 18

pascal 代碼(叠代加深,有更好的算法)

var

temp,ans:array[1..20]of longint;

flag:boolean;

aim:extended;

a,b,te,maxd:longint;

function gcd(a,b:longint):int64;

begin

if b=0 then exit(a);

exit(gcd(b,a mod b));

end;

function lcm(a,b:longint):int64;

var

t:longint;

begin

if a<b then

begin

t:=a;a:=b;b:=t;

end;

exit(a div gcd(a,b)*b);

end;

procedure sum(var s1,s2:int64;m:longint);

var

t:int64;

begin

t:=lcm(s2,m);

if t>100000 then

begin

s1:=10000;

s2:=1;

exit;

end;

s1:=t div s2*s1+t div m;

s2:=t;

t:=gcd(s1,s2);

s1:=s1 div t;

s2:=s2 div t;

end;

procedure fc(s1,s2:longint);

var

i:longint;

begin

if (s1=a)and(s2=b) then

begin

flag:=true;

if ans[maxd]>temp[maxd] then

ans:=temp;

end;

end;

procedure dfs(s:extended;s1,s2,m,i:int64);

var

j:longint;

up,down,t1,t2:int64;

begin

if s1/s2>aim then exit;

if i>maxd then begin fc(s1,s2); exit;end;

up:=trunc(1/(aim-s));

if up<m then up:=m;

down:=trunc((maxd-i+1)/(aim-s))+100;

for j:=up to down do

begin

temp[i]:=j;

t1:=s1;t2:=s2;

sum(t1,t2,j);

dfs(s+1/j,t1,t2,j+1,i+1);

end;

end;

procedure print;

var

i:longint;

begin

for i:=1 to maxd-1 do

write(ans[i],' ');

writeln(ans[maxd]);

end;

begin

fillchar(ans,sizeof(ans),$3f);

read(a,b);

te:=gcd(a,b);

a:=a div te;

b:=b div te;

aim:=a/b;

maxd:=1;

flag:=false;

while not flag do

begin

inc(maxd);

dfs(0,0,1,2,1);

end;

print;

end.

還有更基礎的解法,初學者可用:

var a,b,c:integer;

begin

write('a,b=');readln(a,b);

write(a,'/',b,'=');

repeat

c:=b div a +1;

a:=a*c-b;

b:=b*c;

write('1/',c);

write('+');

until (a=1) or (b mod a=0);

if (b mod a=0)and(a<>1)

then write('1/',b div a);

if a=1 then write('1/',b);

readln;

end.

  • 上一篇:想去德國或瑞士留學,怎麽申請
  • 下一篇:初壹課程有哪些廈門
  • copyright 2024編程學習大全網