Einzelnen Beitrag anzeigen

WS1976
(Gast)

n/a Beiträge
 
#39

Re: Zahl als Bruch speichern

  Alt 15. Okt 2007, 05:55
Hallo,

hier meine Lösung:

Delphi-Quellcode:
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.
Grüsse
Rainer

PS: Bis auf die Grundrechenarten ist alles aus der DP zusammengesucht.
  Mit Zitat antworten Zitat