Entwickler-Ecke
Algorithmen, Optimierung und Assembler - KgV-Berechnung
-delphin- - Mi 22.06.05 16:56
Titel: KgV-Berechnung
Hallo, ich will das KgV zweier Zahlen berechnen. Es soll so aussehen, dass man in 2 Editfelder jeweils eine Zahl eingibt und im Memo dann das kleine gemeinsame Vielfache (kgV) ausgegeben wird (von 25 und 4 z.b. 100).
Dies soll so berechnet werden, weil ich mir dachte, dass es am einfachsten ist, dass man in einer schleife 25 immer mit einem mehr multipliziert (25,50,75,100) und überprüft, wann eine Zahl durch 4 teilbar ist.
mein quelltext:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| procedure TForm1.Button1Click(Sender: TObject); var Zahl1, Zahl2, i : integer; begin Memo1.Clear; If Edit1.Text>Edit2.Text then begin Zahl1 := StrToInt(Edit1.Text); Zahl2 := StrToInt(Edit2.Text); end else begin Zahl2 := StrToInt(Edit1.Text); Zahl1 := StrToInt(Edit2.Text); end; repeat for i:=1 to Zahl2 do begin Zahl1 := (Zahl1 * i); end; until Zahl1 mod Zahl2 = 0; If Zahl1 mod Zahl2 = 0 then Memo1.Lines.Add(IntToStr(Zahl1)); end;
end. |
Nur leider zeigt er mir im memo immer nur eine 0 an, es sei denn, die Zahlen sind gleich, dann zeigt er mir eine sehr hohe Zahl an (bei 4 und 4 96; bei 5-5 600; bei 6-6 4320 oO). Kann mir jemand sagen, wo der fehler ist??
Allesquarks - Mi 22.06.05 17:23
In deinem Beisoiel wolltest du doch zu 25 jeweils 25 hinzuaddieren.
also
bei dir wird
Delphi-Quelltext
1: 2:
| zahl1:=25*2=50; zahl1:=50*3=150; |
gerechnet
-delphin- - Mi 22.06.05 17:27
ändert sich nix immernoch 0.. außer bei 4 und 4 kommt jetz 64 raus statt 96 (sollte aber nur 4 rauskommen)
Allesquarks - Mi 22.06.05 17:33
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var kgvvalue:integer; begin
kgvvalue:=zahl1; repeat kgvvalue := (kgvvalue + zahl); until (kgvvalue mod Zahl2 = 0);
end; |
-delphin- - Mi 22.06.05 17:35
es soll auch nur mit 2 gehen, tuts aber nicht
Allesquarks - Mi 22.06.05 17:37
Vielleicht liegt es ja an der Ausgabe. Ansonsten könntest du es ja mal über Primfaktorzerlegung versuchen.
P.S.: Hab die Source oben nochmal geändert!
Heiko - Mi 22.06.05 17:38
Man oh man, das machst du dir schwer ;).
[quote:d3ae412f53="[
Delphi]N"]
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| If Edit1.Text>Edit2.Text then begin Zahl1 := StrToInt(Edit1.Text); Zahl2 := StrToInt(Edit2.Text); end else begin Zahl2 := StrToInt(Edit1.Text); Zahl1 := StrToInt(Edit2.Text); end; |
[/quote:d3ae412f53]
Edit1.Text>Edit2.Text ergibt nicht das was du haben willst. Du müsstest, wenn du nachdenkst dürftest du wissen warum, die Texte erst in Integer umwandeln und dann erst vergleichen.
Kürzer geht es aber so (unit Math einbinden):
Delphi-Quelltext
1: 2:
| Zahl1:=Max(StrToInt(Edit1.Text), StrToInt(Edit2.Text)); Zahl1:=Min(StrToInt(Edit1.Text), StrToInt(Edit2.Text)) |
Sieht doch wesentlich kürzer und einfacher aus ;).
Des weiteren dürfte dein zweiter Teil manchmal eine Endloschleife ergeben. Des wegen hier eine bessere Variante:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| for i:=2 to Zahl2 do begin if (Zahl1 mod i=0) and (Zahl2 mod i=0) then begin Memo1.Lines.Add(IntToStr(i)); break end end |
Moderiert von
Christian S.: Name in Quote-Tag geändert
-delphin- - Mi 22.06.05 17:49
folgender quelltext:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Button1Click(Sender: TObject); var Zahl1, Zahl2, i : integer; begin Memo1.Clear; Zahl1:=Max(StrToInt(Edit1.Text), StrToInt(Edit2.Text)); Zahl1:=Min(StrToInt(Edit1.Text), StrToInt(Edit2.Text)); for i:=2 to Zahl2 do begin if (Zahl1 mod i=0) and (Zahl2 mod i=0) then begin Memo1.Lines.Add(IntToStr(i)); break end end end;
end. |
ergebnis: 0 ;)
wo liegt der fehler?? oO
Allesquarks - Mi 22.06.05 17:52
@@ Heiko:
Ich weiß nicht wofür dein letzter Code-Abschnitt gedacht war, allerdings sind z.B. 6 und 4 bei i=2 beide restlos teilbar, also deine Bedingung erfüllt i ist aber nicht das KGV. Kannst auch nicht einfach mit i multiplizieren (8 und 14 sind beide durch 2 teilbar das KGV ist aber nicht 14*2)
Heiko - Mi 22.06.05 17:58
@[Delphi]N: Gib mal deine Testwerte.
Sry, ich hatte an den kleineten gemeinsamen Nenner gedacht :oops: .
WeBsPaCe - Mi 22.06.05 18:00
Probier' doch einfach mal diese Funktion da. ;)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function GetKgV(zahl1, zahl2: Integer): Integer; var temp: Integer; begin if (zahl1 < 1) or (zahl2 < 1) then Exit; result := -1; if zahl1 mod zahl2 = 0 then result := zahl1; if zahl2 mod zahl1 = 0 then result := zahl2; if result <> -1 then Exit; if zahl1 > zahl2 then begin temp := zahl1; zahl1 := zahl2; zahl2 := temp; end; temp := zahl1; repeat temp := temp + 1 until (temp mod zahl1 = 0) and (temp mod zahl2 = 0); result := temp; end; |
//UPDATE:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| function GetKgV(zahl1, zahl2: Integer): Integer; begin if (zahl1 < 1) or (zahl2 < 1) then Exit; result := -1; if zahl1 mod zahl2 = 0 then result := zahl1; if zahl2 mod zahl1 = 0 then result := zahl2; if result <> -1 then Exit; if zahl1 > zahl2 then begin result := zahl1; zahl1 := zahl2; zahl2 := result; end; result := zahl1; repeat result := result + 1 until (result mod zahl1 = 0) and (result mod zahl2 = 0); end; |
Heiko - Mi 22.06.05 18:08
Es müsste auch das für das KgV funktionieren (ungetestet):
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| i:=1; while (Zahl1*i) mod Zahl2<>0 do begin inc(i) end; Memo1.Lines.Add(IntToStr(Zahl1*i)) |
//Update
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| if (Sign(Zahl1)=1) or (Sign(Zahl2)=1) then begin i:=1; while (Zahl1*i) mod Zahl2<>0 do begin inc(i) end; Memo1.Lines.Add(IntToStr(Zahl1*i)) end |
Allesquarks - Mi 22.06.05 18:09
ist aber arg langsam immer nur 1 hinzuzuaddieren
Hier mal mit Primfaktorzerlegung:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| function KGV(Zahl1,Zahl2:integer):integer; var i,kgv:integer;nureinmal:boolean; begin kgv:=1; For i:=2 to max(zahl1,Zahl2) do begin nureinmal:=false; if zahl1 mod i=0 then begin kgv:=kgv*i; zahl1:=zahl1/i; nureinmal:=true; end; if (zahl1 mod i=0) then begin if (nureinmal=false) then begin kgv:=kgv*i; zahl2:=zahl2/i; continue; end else begin zahl2:=zahl2/i;end; end; end;
end; |
so nich getestet
//Update sorry geht nicht mit for schleife
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| function KGV(Zahl1,Zahl2:integer):integer; var i,kgv,bounds:integer;nureinmal:boolean; begin
kgv:=1; bounds:=max(zahl1,Zahl2);
repeat inc(i) nureinmal:=false; if zahl1 mod i=0 then begin kgv:=kgv*i; zahl1:=zahl1/i; nureinmal:=true; end; if (zahl1 mod i=0) then begin if (nureinmal=false) then begin kgv:=kgv*i; zahl2:=zahl2/i; end else begin zahl2:=zahl2/i;end; end; if (nureinmal=true) then begin dec(i); until (i>=bounds);
end; |
WeBsPaCe - Mi 22.06.05 18:17
Allesquarks hat folgendes geschrieben: |
ist aber arg langsam immer nur 1 hinzuzuaddieren |
Klar... ;) Ist aber eine ziemlich einfache Lösung... Und bei kleinen Zahlen, wie sie IMHO [Delphi]N benutzt, ist's wahrscheinlich sogar schneller... :tongue:
Heiko - Mi 22.06.05 18:23
Meine dürfte eigentlich am schnellsten sein. Die dürfte man soagr nicht weiter optimieren können ;).
Narses - Mi 22.06.05 23:06
Moin!
Ich hätte da noch den Vorschlag, das nach Euklid zu lösen: :wink:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.Button1Click(Sender: TObject); var z1,z2,r: Integer; begin z1 := StrToIntDef(Edit1.Text,0); z2 := StrToIntDef(Edit2.Text,0); r := z1 mod z2; while (r <> 0) do begin z1 := z2; z2 := r; r := z1 mod z2; end; r := z2; Edit3.Text := IntToStr(r); z1 := StrToIntDef(Edit1.Text,0); z2 := StrToIntDef(Edit2.Text,0); Edit4.Text := IntToStr((z1 *z2) div r); end; |
cu
Narses
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!