Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Abfrage bei Primzahltest übersprungen
Stinger47 - Sa 01.12.07 18:52
Titel: Abfrage bei Primzahltest übersprungen
Hi,
hab mal versucht einen Primzahlentest zu schreiben (der noch erweitert wird), der einen Bereich auf Primzahlen prüft.
Funktioniert soweit auch, dass einzige was noch fehlt ist die Ausnahme 1.
Warum auch immer überspringt die Überprüfung falls i = 1 ist.
Hier einmal der Code.
Zeile 28-33 wird übersprungen und füngt 1 anstatt in Listbox2 in Listbox 3 ein.
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: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51:
| procedure TForm1.SetMyPrimtest(VonZahl, BisZahl: Integer); var i,k: Integer; FLAG: Boolean; begin
for I := VonZahl to BisZahl do begin
FLAG := TRUE;
if not odd(i) then begin
if i = 2 then Listbox3.Items.Add(IntToStr(i));
Listbox1.Items.Add(IntToStr(i)); FLAG := FALSE;
end else begin
for k := 2 to TRUNC(i / 2) do begin
if i = 1 then begin Listbox2.Items.Add(IntToStr(i)); FLAG := FALSE; EXIT; end;
if (i mod k) = 0 then begin Listbox2.Items.Add(IntToStr(i)); FLAG := FALSE; EXIT; end;
end;
if FLAG = TRUE then Listbox3.Items.Add(IntToStr(i));
end;
end;
end; |
danke für antworten...:)
TGLDX - Sa 01.12.07 19:15
Delphi-Quelltext
1: 2: 3: 4: 5:
| for k := 2 to TRUNC(i / 2) do begin if i = 1 then begin ... |
Das ergibt mit i=1 folgendes:
Delphi-Quelltext
1: 2: 3: 4: 5:
| for k := 2 to 0 do begin if i = 1 then begin ... |
Eine For-Schleife von 2 bis 0 wird nicht durchlaufen.
Stinger47 - Sa 01.12.07 19:31
hmmm ok das hab ich behobe aber die Schleifen werden nicht vollständig durchlaufen.
Habe zwei Editfelder, in denen ich VonZahl und BisZahl auslese.
die Schleife wird allerdings immer nur bis 9 durchlaufen egal wie hoch ich BisZahl setze.
Setze ich VonZahl höher als 10 dann werden immer nur ein bis zwei Zahlen eingetragen.
Hier nun der behobene Code
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: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52:
| procedure TForm1.SetMyPrimtest(VonZahl, BisZahl: Integer); var i,k: Integer; FLAG: Boolean; begin
for I := VonZahl to BisZahl do begin
FLAG := TRUE;
if not odd(i) then begin
if i = 2 then Listbox3.Items.Add(IntToStr(i));
Listbox1.Items.Add(IntToStr(i)); FLAG := FALSE; end else begin
for k := 2 to TRUNC(i / 2) do begin
if (i mod k) = 0 then begin Listbox2.Items.Add(IntToStr(i)); FLAG := FALSE; EXIT; end;
end;
if i = 1 then begin Listbox2.Items.Add(IntToStr(i)); FLAG := FALSE; end;
if FLAG = TRUE then Listbox3.Items.Add(IntToStr(i));
end;
end;
end; |
TGLDX - Sa 01.12.07 19:48
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| for k := 2 to TRUNC(i / 2) do begin if (i mod k) = 0 then begin Listbox2.Items.Add(IntToStr(i)); FLAG := FALSE; EXIT; end; |
Bei i = 9 läuft die Schleife von 2 bis 4.
Wenn k = 3 , ist (i mod k) = 0
=> 9 wird zur ListBox2 hinzugefügt und dann wird die
Prozedur mit
exit verlassen .
Ich denke du willst nicht die Prozedur, sondern die For-Schleife verlassen,was man mit
break erreicht.
Stinger47 - Sa 01.12.07 20:44
dankeschön funktioniert jetzt auch.
dachte die befehler liefen auf das selbe hinaus...wieder schlauer
danke noochmal...:)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!