Evgen писал(а):но постараюсь реализовать алгоритм Iskandera
Evgen, вы это о чем? Ну, хорошо, так и быть.
Насколько я понял,
Дож предлагает выполнить то что описал в один проход.
Я предлагаю самую чуточку попроще.
Для начала вам нужно подумать, как модифицировать решето Эратосфена,
чтобы имея список простых чисел от 2 до Sqrt(B), можно было начинать
вычеркивать составные числа начиная с произвольного наперед заданного числа.
Ну и соответственно сначала с помощью обычного решета получаете список простых чисел,
затем во втором проходе применяете модифицированный алгоритм.
Вадим, чот этот PA12I удобен как штаны с ширинкой сзади.
Сначала посчитать примерную длину массива,
заполнить его каким-то сигнальным значением,
выполнить процедуру,
пройти еще раз по массиву и посчитать количество элементов,
усечь массив, если нужно.
Предлагаю более удобный вариант:
- Код: Выделить всё
type
TIntArray = array of Integer;
function PrimeSieve(UpBound: Integer): TIntArray;
var
IsPrime: array of Boolean = nil;
I, Count: Integer;
J: Int64;
begin
if UpBound < 2 then
exit(nil);
SetLength(IsPrime, UpBound + 1);
for I := 0 to High(IsPrime) do
IsPrime[I] := True;
Count := 0;
for I := 2 to High(IsPrime) do
if IsPrime[I] then
begin
Inc(Count);
J := Int64(I) * Int64(I);
while J <= UpBound do
begin
IsPrime[J] := False;
Inc(J, I);
end;
end;
SetLength(Result, Count);
J := 0;
for I := 2 to High(IsPrime) do
if IsPrime[I] then
begin
Result[J] := I;
Inc(J);
end;
end;
По скорости постараюсь вечером сравнить.