unit U_bruchrechnen;
interface
Type
Bruchtyp=packed
record
z,n: int64;
// Int64 wegen sehr großer Zahlen
end;
TBruch =
class(TObject)
//kleinsten gemeinsamen Teiler ermitteln
function ggt(b0,b1:int64):int64;
//kleinstes gemeinsames Vielfaches ermitteln
function kgv(b0,b1:int64):int64;
//Bruch kürzen
function red(b0,b1:int64):Bruchtyp;
//Bruch bo und b1 addieren
function add(b0,b1: Bruchtyp):Bruchtyp;
//Von Bruch b0 Bruch b1 abziehen
function sub(b0,b1: Bruchtyp):Bruchtyp;
//Bruch bo und b1 multiplizieren
function mul(b0,b1: Bruchtyp):Bruchtyp;
//Bruch bo durch Bruch b1 dividieren
function divide(b0,b1: Bruchtyp):Bruchtyp;
end;
implementation
function TBruch.add(b0,b1: Bruchtyp):Bruchtyp;
var a:integer;b:bruchtyp;
Begin
a:=kgv(b0.n,b1.n);
b.n:=a;
b.z:=(a
div b0.n)*b0.z+(a
div b1.n)*b1.z;
result:=red(b.z,b.n);
End;
function TBruch.sub(b0,b1: Bruchtyp):Bruchtyp;
var a:integer;b:bruchtyp;
Begin
a:=kgv(b0.n,b1.n);
b.n:=a;
b.z:=(a
div b0.n)*b0.z-(a
div b1.n)*b1.z;
result:=red(b.z,b.n);
End;
function TBruch.mul(b0,b1: Bruchtyp):Bruchtyp;
Begin
result:=red(b0.z*b1.z,b0.n*b1.n);
End;
function TBruch.divide(b0,b1: Bruchtyp):Bruchtyp;
// div geht nicht, weil das ja ein geschützter begriff ist...
Begin
result:=red(b0.z*b1.n,b0.n*b1.z);
End;
function TBruch.ggt(b0,b1:int64):int64;
var a,b,r:integer;
Begin
If b0>b1
then
Begin
a:=b0; b:=b1
end
else
begin
b:=b0; a:=b1;
end;
// Berechnung des ggt
repeat
r:= a
mod b;
a:=b;
b:=r
until (r=0);
result:=a;
End;
function TBruch.kgv(b0,b1:int64):int64;
Begin
result:=b0*b1
div ggt(b0,b1);
End;
function TBruch.red(b0,b1:int64):Bruchtyp;
var a,a0,a1:integer;
Begin
a0:=b0;a1:=b1;
while ggt(a0,a1)<>1
do
Begin
a:=ggt(a0,a1);
a0:=a0
div a;
a1:=a1
div a;
End;
result.z:=a0;
result.n:=a1;
End;
end.