Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#3

AW: Sieb des Erathosthenes

  Alt 17. Jan 2013, 11:18
Hier steckt schonmal ein Fehler:

Delphi-Quellcode:
    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
Das Delete löscht ja den aktuellen Eintrag. Dann darf das n nicht erhöht werden, sonst überspringst du einen Wert.

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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe (17. Jan 2013 um 11:21 Uhr)
  Mit Zitat antworten Zitat