Seiten: >1< | |
|
Verfasser: | Nachricht: |
| kgv-Funktion für lars | | Hi,
function TForm1.kgv(p1, p2 : Integer) : Integer;
var zahl : Integer;
begin
if p2 > p1 then
result := kgv(p2, p1)
else
begin
zahl := p1;
repeat
zahl := zahl + p1;
if zahl mod p2 = 0 then
begin
result := zahl;
exit;
end;
until false;
end;
end;
MfG Eisflamme |
|
| Re: kgv-Funktion für lars | | mich?!
btw.: ist das nich ziehmlich langsam?
Dieser Beitrag wurde bereits 1 Mal editiert. Zuletzt am 17.08.2006 um 12:53:03 Uhr von . |
|
| Re: kgv-Funktion für lars | | Hi,
hm, optimier's doch, aber ich meinte Lars Hennecke aka .
MfG Eisflamme
Dieser Beitrag wurde bereits 1 Mal editiert. Zuletzt am 18.08.2006 um 10:04:12 Uhr von . |
|
| Re: kgv-Funktion für lars | | ich bin der wahre lars .... scheiss faker ^^ |
|
| Re: kgv-Funktion für lars | | Ein bisschen mehr Achtsamkeit bei der Wortwahl bitte |
|
| Re: kgv-Funktion für lars | | Mein Gehirn hat grad Leerlauf, also nutz ich die Ressourcen mal und stell die Lösung vor, die mir so vorschweben würde...
Und so ein Tipp am Rande: In Delphi setzt man vor end oder until kein Semikolon. Ist stilistisch schlecht.
function kgv(p1, p2: Integer): Integer;
var i: Integer;
begin
for i := 1 to p2 do begin
if ((p1*i) mod p2)<>0) continue;
result := p1*i
end
end;
|
|
| Re: kgv-Funktion für lars | | Hi,
ja, das ist jetzt in Deinem Fall halt ne iterative Lösung.
Aber wieso ist das stilistisch schlecht?
MfG Eisflamme |
|
| Re: kgv-Funktion für lars | | Deine Lösung war auch iterativ, weil ne Schleife verwendet wird... eine ohne Zählvariable, aber dennoch iterativ.
Unnötige Semikolons sollte man sich sparen, da der Compiler da meistens suboptimalen Code erzeugt, weil er an der Stelle dann mit einem zusätzlichen Befehl rechnet, der aber nicht kommt. NOPs sind da wenig sinnvoll...
Zudem spart man einige Byte im Quellcode, Tinte beim Ausdrucken... und es sieht schöner aus. |
|
| Re: kgv-Funktion für lars | | Hi,
hast Recht, war iterativ, hab net genau hingeschaut.
Ok, was den Stil angeht, hab ich's jetzt auch kapiert, thx.
MfG Eisflamme |
|
| Re: kgv-Funktion für lars | | Algorithmen sind eine spannende Sache, da bin ich immer dabei.
Wie wär's mit folgender kgV-Implementierung? Die ist sehr schnell, da nur Additionen und Vergleiche verwendet werden.
function kgv(p1, p2: Integer): Integer;
var x, y: Integer;
begin
x := p1; y := p2;
while x<>y do
if x<y then x := x + a
else y := y + b;
kgV := x;
end;
Dieser Beitrag wurde bereits 1 Mal editiert. Zuletzt am 16.09.2006 um 17:37:05 Uhr von . |
|
| Re: kgv-Funktion für lars | | und was sind a und b? |
|
| Re: kgv-Funktion für lars | |
Zitat: lars am 16.09.2006 um 20:01:08 und was sind a und b?
5 EP, wenn du das selber rausfindest. Dann hast du den Algorithmus auch verstanden!
Okay, habe geschlampert. Sorry!
a ist p1, b ist p2. So ist es richtig:
function kgv(p1, p2: Integer): Integer;
var x, y: Integer;
begin
x := p1; y := p2;
while x<>y do
if x<y then x := x + p1
else y := y + p2;
kgV := x;
end; |
|
| Re: kgv-Funktion für lars | | langsam wird es dann nur wenn man werte wie 3 und 232432484 nimmt... :p
da ist es dann doch schneller wenn man erst den ggt ausrechnet(eigentlich ist es in fast allen fällen schneller). leider c unter delphi hätte ich es nicht testen könen
int ggt(int p1, int p2)
{
int k = 0;
while(!(p1 % 2) && !(p2 % 2))
{
p1 = p1 >> 1;
p2 = p2 >> 1;
k++;
}
int t;
if(p1 % 2)
{
t = -p2;
}
else
{
t = p1;
}
while(t != 0)
{
while(!(t % 2))
{
t = t >> 1;
}
if(t > 0)
{
p1 = t;
}
else
{
p2 = -t;
}
t = p1 - p2;
}
return p1 << k;
}
int kgv(int p1, int p2)
{
return p1 * p2 / ggt(p1, p2);
}
Dieser Beitrag wurde bereits 1 Mal editiert. Zuletzt am 16.09.2006 um 21:48:18 Uhr von . |
|
| Re: kgv-Funktion für lars | |
Zitat: lars am 16.09.2006 um 21:41:33 da ist es dann doch schneller wenn man erst den ggt ausrechnet(eigentlich ist es in fast allen fällen schneller).
Ja, sicher. Wir kennen ja den Zusammenhang ggT(a,b) * kgV(a,b) = ab. Damit können wir folgenden eleganten Ansatz (auch C-Code) nehmen:
function ggt(int p1, int p2) {
if (p2 == 0)
return p1;
else
return ggt(p2, p1%p2);
}
function kgv(int p1, int p2) {
int a = ggt(p1, p2);
int b = (p1 * p2) / a;
return b;
}
Dieser Beitrag wurde bereits 1 Mal editiert. Zuletzt am 16.09.2006 um 21:52:21 Uhr von . |
|
Seiten: >1< | |
|