Delphi-PRAXiS
Seite 6 von 9   « Erste     456 78     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung (https://www.delphipraxis.net/155991-ggt-und-kgv-von-2-zahlen-berechnen-absolut-keine-ahnung.html)

gammatester 21. Nov 2010 18:49

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

Zitat von Klaus01 (Beitrag 1063067)
Ich hoffe der Lösungsweg ist einigermaßen verständlich.

Mag ja sein, aber leider ist er ziemlich falsch. Deine Funktion bietet noch nicht einmal die Symmetrie ggt(a,b)=ggt(b,a), wie man leicht an ggt(2,-2) = 0 und ggt(-2,2) = 2 sieht. Außerdem werden leider wieder einmal völlig falsche Werte für negative Zahlen geliefert, einerseits mit voller Absicht: ggt(a,b) = 0 für b <= 0! (Warum das ganze?). Andererseits (wohl) aus Unkenntnis der mod-Funktion: ggt(-5,2) = -1. Eine verbesserte Version könne so aussehen:
Delphi-Quellcode:
 function ggt(zahl1,zahl2: integer): integer;
var
  rest: integer;
begin
  zahl1 := abs(zahl1);
  zahl2 := abs(zahl2);
  while zahl2>0 do begin
    rest := zahl1 mod zahl2;
    zahl1 := zahl2;
    zahl2 := rest;
  end;
  ggt := zahl1;
end;

wolfgang_SV 21. Nov 2010 19:27

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

das was du nun erzählst ist völlig daneben..

nimm die funktion aus meinem ersten Programmbeispiel ..#5

ggt(a,b) liefert dasgleiche wie ggt(b,a)

sollten a oder b negativ sein , was von der mathematischen definition
bez. modulo gar nicht vorgesehen ist ( hier unterscheidet sich mal wieder Mathematik von programmier-sprachen)

dann sollte man so vorgehen :
c:=abs(ggt(a,b));

wolfgang_SV 21. Nov 2010 19:50

AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function ggt(a,b : integer) : integer;
  var r : integer;
  begin
 
  repeat
  r:= a mod b;
  a:=b;
  b:=r;
  until r=0;

  result:=a;
  end;

procedure TForm1.Button1Click(Sender: TObject);
  var a,b,c : integer;
  begin
  a:=strtoint(edit1.text);
  b:=strtoint(edit2.text);

  c:=abs(ggt(a,b));

  label1.caption:=inttostr(c);
  end;

end.
mehr sag ich jetzt nicht...
weil so geht es...
und wenn man jetzt für a oder b den wert 0 eingibt...
ok.. dann kann man das ja abfangen...

gammatester 21. Nov 2010 20:06

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

Zitat von wolfgang_SV (Beitrag 1063124)
@gammatester

das was du nun erzählst ist völlig daneben..

Was ist völlig daneben? Ein fehlerhaftes Ergebnis meiner Funktion würde mir reichen.
Zitat:

Zitat von wolfgang_SV (Beitrag 1063124)
nimm die funktion aus meinem ersten Programmbeispiel ..#5

ggt(a,b) liefert dasgleiche wie ggt(b,a)

Wie man leicht sieht, beziehe ich mich auf Klaus (wer lesen kann, ist klar im Vorteil).
Zitat:

Zitat von wolfgang_SV (Beitrag 1063124)
sollten a oder b negativ sein , was von der mathematischen definition
bez. modulo gar nicht vorgesehen ist ( hier unterscheidet sich mal wieder Mathematik von programmier-sprachen)

dann sollte man so vorgehen :
c:=abs(ggt(a,b));

Ich 'erzähle' nichts, sondern zeige nur die Ergebnis von Klaus's letzter Funktion. Wenn Du meinst, daß ist 'daneben". dann stimmen wird ja überein. Wir stimmen allerdings nicht überein in folgenden Punkten:

- der ggt von negativen Zahlen und mod von negativen Zahlen ist selbstverständlich mathematisch vorgesehen

- Programmiersprachen unterscheiden sich darin nicht: mod ist zumindest in Pascal für negative Zahlen definiert. ggt nicht, muß also selbstgeschrieben werden. Aber möglichst richtig. Pascal mod und mathematisches mod unterscheiden sich leider. Pascal: -5 mod 3 = -2, mathematisch ist -5 mod 3 = 1. Der mathematische Rest a mod b für b > 0 ist nämlich: 0 <= a mod b < b. Was bei Pascal nun mal leider nicht der Fall. Wenn man einen mathematisch korrekten ggt via Euklidischem Algorithmus berechnen will muß man das berücksichtigen.

- c:=abs(ggt(a,b)) ist zwar richtig, aber nur wenn ggt schon halbwegs richtig ist, Klaus ' Funktion liefert ggt(-2,-2)=0.

Sir Rufo 21. Nov 2010 20:10

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

Zitat von wolfgang_SV (Beitrag 1063124)
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.

wolfgang_SV 21. Nov 2010 20:34

AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung
 
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...

wolfgang_SV 21. Nov 2010 20:43

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

ok.. entschuldigung
habe die procedure von klaus01 soweit nicht getestet.
wenn seine funktion für ggt(a,b) einen anderen wert als ggt(b,a) liefert , abgesehen vom vorzeichen , ist sie natürlich schrott!!!

PS. obwohl auch das Vorzeichen müßte gleich sein

Klaus01 21. Nov 2010 20:54

AW: ggT und KgV von 2 Zahlen berechnen - absolut keine Ahnung
 
.. gut, dass ich mal wieder ein schlechtes Beispiel sein durfte..
Klaus

wolfgang_SV 21. Nov 2010 21:06

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

bez. Mathematik und natürliche Zahlen

Die Division mit Rest oder der Divisionsalgorithmus ist ein mathematischer Satz aus der Algebra und der Zahlentheorie. Er besagt, dass es zu zwei Zahlen n und m <>0 aus N ( natürliche Zahlen ) eindeutig bestimmte Zahlen a und b gibt für die gilt :

n=a*m +b ; 0<=b<m

gammatester 22. Nov 2010 08:17

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

Zitat von wolfgang_SV (Beitrag 1063147)
@gammatester

bez. Mathematik und natürliche Zahlen

Die Division mit Rest oder der Divisionsalgorithmus ist ein mathematischer Satz aus der Algebra und der Zahlentheorie. Er besagt, dass es zu zwei Zahlen n und m <>0 aus N ( natürliche Zahlen ) eindeutig bestimmte Zahlen a und b gibt für die gilt :

n=a*m +b ; 0<=b<m

Wenn Du schon Wiki wörtlich zitierst, dann bitte richtig (Quellenangabe könnte nicht schaden) und ohne verfälschende Zusätze. Da steht eben nicht "(natürliche Zahlen)". Mit diesem von Dir frei erfundenen Zusatz ist der Satz nämlich falsch, wie man leicht an der eindeutigen Darstellung der Division 3 durch 5 sieht: 3 = 0*5 + 3. Aber als nächstes willst Du wahrscheinlich noch sagen, daß 0 natürlich eine natürliche Zahl ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:50 Uhr.
Seite 6 von 9   « Erste     456 78     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz