![]() |
Sieb des Erathosthenes
Hallo,
ich probiere seit ein paar Stunden das folgende WirWar zum laufen zu bringen...
Code:
Er will mir einfach nicht richtig die Zahlen aus der TStringList streichen und nach einer Weile bekomme ich einen Fehler das ich ueber das Listenende waere. Ich benutze die TStringList weil dadurch die Elemente nachruecken wenn ich eines entferne was ja in einem Array nicht der fall ist.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; ListBox1: TListBox; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var primes:TStringList; nr:Integer; i,j,n, luckynr: Integer; begin primes:= TStringList.Create; nr:= strtoint(edit1.Text); for i:= 2 to nr do begin primes.Add(inttostr(i)); end; //showmessage(primes[-1]); i:=0; n:= i+1; while True do begin j := strtoint(primes[n]); luckynr:=strtoint(primes[i]); if j = strtoint(primes[primes.count-1]) then begin if j mod luckynr = 0 then begin primes.Delete(primes.IndexOf(inttostr(j))); end; i:=i+1; n:=i+1; end else if j mod luckynr = 0 then begin primes.Delete(primes.IndexOf(inttostr(j))); n:=n+1 end else if luckynr = strtoint(primes[primes.count-1]) then begin break; end else begin n:=n+1; end; end; end; end. Greetz Dolphin |
AW: Sieb des Erathosthenes
Delphi-Quellcode:
oder gleich:
var
primes: TStringList; i, j, nr, curr: Integer; begin primes := TStringList.Create; try nr := strtoint(Edit1.Text); for i := 2 to nr do begin primes.Add(inttostr(i)); end; for i := 2 to nr do begin for j := primes.Count - 1 downto 0 do begin curr := StrToInt(primes[j]); if (curr <> i) and (curr mod i = 0) then begin primes.Delete(j); end; end; end; Listbox1.Items.Assign(primes); finally primes.Free; end; end;
Delphi-Quellcode:
var
primes: TStringList; i, j, nr, curri,currj: Integer; begin primes := TStringList.Create; try nr := strtoint(Edit1.Text); for i := 2 to nr do begin primes.Add(inttostr(i)); end; for i := primes.Count - 1 downto 0 do begin for j := primes.Count - 1 downto 0 do begin curri := StrToInt(primes[i]); currj := StrToInt(primes[j]); if (currj <> curri) and (currj mod curri = 0) then begin primes.Delete(j); end; end; end; Listbox1.Items.Assign(primes); finally primes.Free; end; end; |
AW: Sieb des Erathosthenes
Hier steckt schonmal ein Fehler:
Delphi-Quellcode:
Das Delete löscht ja den aktuellen Eintrag. Dann darf das n nicht erhöht werden, sonst überspringst du einen Wert.
else if j mod luckynr = 0 then begin
primes.Delete(primes.IndexOf(inttostr(j))); n:=n+1 end else if luckynr = strtoint(primes[primes.count-1]) then begin Im Übrigen überprüfst du die Abbruchkriterien zu spät, daher die Range-Fehler. Weiterhin sind deine IndexOf-Aufrufe tödlich für die Performance. Wenn man berücksichtigt, daß j ja die Zahl an Stelle n in der StringList darstellt, dann gilt n = primes.IndexOf(inttostr(j)). Somit vereinfacht sich dein Code auf unter Berücksichtigung der Bereichsgrenzen auf:
Delphi-Quellcode:
i := 0; { der letzte Eintrag braucht niemals überprüft zu werden } while i < primes.count - 1 do begin luckynr := strtoint(primes[i]); n := i + 1; while n < primes.Count do begin j := strtoint(primes[n]); if j mod luckynr = 0 then begin primes.Delete(n); end else begin n := n + 1; end; end; i := i + 1; end; |
AW: Sieb des Erathosthenes
Zitat:
|
AW: Sieb des Erathosthenes
@Uwe Raabe stimmt ...:oops:
|
AW: Sieb des Erathosthenes
@Bummi, so als Beispiel wird bei N = 100 in deinem Fall die innere Schleife 8284x durchlaufen, während bei aufsteigendem Duchlauf nur 411 Durchläufe kommen. Der Grund liegt darin, daß bei rückwärtigem Durchlauf die niedrigen Primzahlen erst sehr spät zur Überprüfung kommen. Diese sorgen aber für eine größere Ausdünnung des Siebs.
|
AW: Sieb des Erathosthenes
Hallo,
vielen Dank euch 2 fuer die fixe Antwort. Jetzt kann ich schauen was in meinem Code schief lief. Ich hatte auch das Problem das ich mit .delete Strings aus der Liste loeschte sie aber in der naechsten Schleife wieder vorhanden waren. Woran liegt das? |
AW: Sieb des Erathosthenes
@Uwe Raabe ich weiß schon und habe es nach Deiner Antwort selbst getestet.
Ich kann meinen Beitrag löschen, oder als schlechtes Beispiel stehen lassen .... |
AW: Sieb des Erathosthenes
Zitat:
Hast Du einmal den Debugger bemüht? Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 Uhr. |
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 by Thomas Breitkreuz