[ Ray001 @ 14.04.2004. 18:31 ] @
Pitanjce,
Kako napraviti engine u pascalu koji bi skratio razlomak?

Hvala
[ del-boy @ 14.04.2004. 22:30 ] @
Pa proveriš da li su i brojilac i imanilac deljivi sa istim brojem koji je manji od manjeg od ova dva! Na primer ako imas 5/15 onda proveravas da li su brojilac i imenilac deljivi sa bilo kojim brojem manjim ili jednakim 5 (x mod y=0) i ako jesu podelis ova i skratio si razlomak! I tako radiš dok ga ne skratiš maksimalno!

Ako ti treba baš kod reci i napisaću ti!
[ Bojan Basic @ 14.04.2004. 22:40 ] @
Imaš mnogo jednostavnije rešenje, a to je sledeće:

Pustiš jednu petlju koja će da oduzima manji broj od većeg sve dok se brojevi ne izjednače. Kad se izjednače, neka je njihova vrednost x, e onda i jedan i drugi početni broj podeliš sa tim x, i to je skraćen razlomak. Mislim da brži algoritam od ovog ne postoji, ako ti nešto nije jasno javi se ponovo.
[ del-boy @ 15.04.2004. 00:05 ] @
E sivđa mi se ovaj način. Nisam se toga setio.

Iako nisam ja ovo tražio ipak hvala!
[ Ray001 @ 15.04.2004. 08:30 ] @
Citat:
Bojan Basic:
Imaš mnogo jednostavnije rešenje, a to je sledeće:

Pustiš jednu petlju koja će da oduzima manji broj od većeg sve dok se brojevi ne izjednače. Kad se izjednače, neka je njihova vrednost x, e onda i jedan i drugi početni broj podeliš sa tim x, i to je skraćen razlomak. Mislim da brži algoritam od ovog ne postoji, ako ti nešto nije jasno javi se ponovo.

Mislim da ovo nije ispravno.
Recimo da je razlomak 6/22. Dakle kad se skrati dobijemo 3/11. Prema gornjem algoritmu, petlja se neće izjednačiti, prema tome razlomak se ne može skratiti.
[ Bojan Basic @ 15.04.2004. 19:32 ] @
Ispravno je sigurno, evo ti na tvom primeru:
6 22
6 16
6 10
6 4
2 4
2 2
Sad su jednaki, pa podeliš i 6 i 16 sa 2 i dobiješ skraćeni razlomak.
[ rilax @ 17.04.2004. 14:55 ] @
A ima jos bolje resenje i zove se Euklidov algoritam.

Najlakse se pise rekurzijom i nema mnogo poziva, pa nema frke da ce da pukne stack.

Ideja je sledeca: najveci zajednicki sadrzalac za dva broja (u principu i za dva polinoma) je i najmanji zajednici sadrzalac za manji od njih i ostatak pri deljenju veceg manjim.
Znaci ako je a<b, onda je nzs(a,b)=nzs(b mod a, a);

Znaci, evo funkcije:

function Euclid(a, b: integer): integer;
begin
if a=0 then Euclid:=b
else Euclid:=Euclid(b mod a, a);
end;


Moras da pazis da je prvo mani broj kad pozivas f-ju, pa bi bilo korisno i

function nzs(a, b: integer): integer;
begin
if a<b then nzs:=euclid(a, b) else nzs:=euclid(b, a);
end;


gde ne moras da vodis racuna o redosledu.

Recimo za onaj primer od gore za 6 i 22 imas parove
6 i 22
4 i 6
2 i 4
0 i 2