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)