Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#63

AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung

  Alt 22. Nov 2010, 11:46
c:=abs(ggt(a,b));
Wieso von einer positiven Zahl noch den Absolutwert ermitteln?
Per Definition liefert ggT ein Ergebnis aus der Menge der natürlichen Zahlen und damit.

Weiterhin gilt:
Code:
ggT( -a, b ) = ggT( a, b )
Somit ist es absolut richtig von beiden Eingangsparametern die Absolutwerte zu nehmen.

Weiterhin gilt auch, dass keiner der Eingangswerte 0 sein darf, denn dann ist ggT nicht definiert.
In dem Falle müsste also korrekterweise eine Exception ausgelöst werden.
falsch Sir Rufo..

gib doch einfach mal eine negative Zahl für a oder b ein..

und schau was a mod b dir zurückliefert...
Mir ist es doch völlig wurscht, was a mod b zurückliefert, weil es geht hier um die Definition von ggT und da ist die Definition nun mal so.

Ansonsten musst du dir deine eigene Definition von ggT machen (ggT_SV). Da kann dann meinetwegen alles sein, wie du möchtest.
Auch das wäre mir wurscht

Somit würde die korrekte Version von ggT (nach der gültigen mathematische Definition) wie folgt sein:
Delphi-Quellcode:
function ggT( a, b : integer) : integer;
  var
    aa, ab : integer;
    r : integer;
  begin

    // ggT( 0, 0 ) ist nicht definiert und somit nicht zulässig

    if ( a = 0 ) and ( b = 0 ) then
      raise Exception.Create( 'Kein Wert darf 0 sein!' );

    // das dürfen wir denn ggT( -a, b ) = ggT( a, b )

    aa := abs( a );

    // auch das dürfen wir, denn es gilt ggT( a, b ) = ggT( b, a )
    // und ggT( -a, b ) = ggT( a, b )
    // daraus folgt ggT( a, -b ) = ggT( a, b )
    // und daraus folgt auch ggT( -a, -b ) = ggT( a, b )

    ab := abs( b );

    if ( aa = 0 ) or ( ab = 0 ) then
      begin
        if ( aa = 0 ) then
          Result := ab
        else
          Result := aa;
      end
    else
      begin
        repeat
          r := aa mod ab;
          aa := ab;
          ab := r;
        until r = 0;

        result := aa;
      end;
  end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (22. Nov 2010 um 23:40 Uhr)