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