Thema: Delphi Sieb des Eratosthenes

Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Sieb des Eratosthenes

  Alt 23. Dez 2005, 19:41
Hallo Foxgrove,

die innere Schleife ist eigentlich nicht so sehr problematisch - man darf dabei nur nicht ständig in BASIC denken. Ich habe mich bemüht möglichst nah an deiner Vorgabe dran zu bleiben, aber das zweite Array war mir dann doch zu viel des Guten.

Delphi-Quellcode:
function Sieve(iMax: integer): TIntegerDynArray;
var
  i, iStep, iRoot: integer;
begin
  iRoot := Round(Sqrt(iMax));
  SetLength(Result, iMax);
  for i := 0 to Pred(iMax) do // sieve init
    Result[i] := Succ(i);
  for iStep := 2 to iRoot do
    for i := 2 to iMax div iStep do
      if Result[Pred(i * iStep)] mod iStep = 0 then
        Result[Pred(i * iStep)] := 0; // mark non-prime
  iMax := 3; // first non-prime index
  for i := Succ(iMax) to High(Result) do
    if Result[i] > 0 then
    begin
      Result[iMax] := Result[i]; // pack array
      Inc(iMax);
    end;
  SetLength(Result, iMax); // adjust size
end;
Weihnachtsgrüße vom marabu
  Mit Zitat antworten Zitat