{Определение простых чисел в диапазоне от 0 до 3000}
program mnosh3;
{$APPTYPE CONSOLE}
uses
SysUtils;
constMm=255;// количество значений, заносимых в множество
Nn=3000divMm+1;//количество элементов в массиве
type Mn=set of 1..Mm;
Mas=array[1..Nn] of Mn;
VarA,b:mas;// массивы исходного и получаемого множества чисел
I,j,n,k,l,m,Kb,Ib,Jb,s,Si,Sj,Kp:integer;
function Rus(S:String):String;
Var I:Byte;
begin
Result:='';
for I:=1 to Length(S) do
case S[I] of
'А'..'п': Result:=Result+Chr(Ord(S[I])-64);
'р'..'я': Result:=Result+Chr(Ord(S[I])-16);
'Ё': Result:=Result+Chr(240);
'ё': Result:=Result+Chr(241);
else
Result:=Result+S[I];
end;
end;
begin
WriteLn(Rus('Введите максимальное число диапазона (не более 3000)'));
ReadLn(N);
WriteLn('N=',N:4);
//цикл присваивания начальных значений массивам множеств
for I:=1 to Nn do
begin
A[I]:=[];
B[I]:=[];
end;
{формирование массива множеств из чисел заданного диапазона}
K:=NdivMm;//количество используемых элементов массива мно-
//жеств
L:=NmodMm;//количество чисел в последнем элементе массива
//множеств
//цикл заполнения исходного массива множеств
for I:=1 toKdo
for J:=1 to Mm do
A[I]:=A[I]+[J];
//цикл заполнения последнего элемента исходного массива мно-
//жеств
if L<>0 then //L– количество элементов в последнем множестве
forI:=1toN-K*Mmdo//N-K*Mm-количество элементов в
//предыдущих элементах массива множеств
A[K+1]:=A[K+1]+[I];
{Печать чисел исходного множества}
WriteLn(Rus('Исходное множество'));
for I:=1 toKdo
for J:=1 to Mm do
if J in A[I] then Write((I-1)*Mm+J:4,' ');
if L<>0 then
for I:=1 to N-K*Mm do
if I in A[K+1] then Write((K*Mm+I):4,' ');
ReadLn;
//Поиск простых чисел
B[1]:=B[1]+[1];//добавление единицы в результат
A[1]:=A[1]-[1];//удаление единицы из исходного множества
M:=2; //очередное простое число
if L<>0 thenK:=K+1;//количество непустых элементов массиваA
while A[K]<>[ ] do //цикл поиска простых чисел (пока исходное
begin //множество не станет пустым
S:=M; //установка начального значения очередного удаляемого
//из исходного множества числа
while S<=Ndo //цикл удаления из исходного множества
begin //непростых чисел
Si:=SdivMm; //номер элемента массива множеств, содержа-
//щего удаляемый элемент
Sj:=SmodMm; //номер удаляемого элемента в множестве
ifSj=0thenA[Si]:=A[Si]-[Mm] //исключение числа из
elseA[Si+1]:=A[Si+1]-[Sj];//исходного множества
S:=S+M; //вычисление очередного удаляемого числа
end;
Ib:=MdivMm;//номер элемента массива множеств для добавле-
//ния очередного простого числа
Jb:=MmodMm;// номер добавляемого элемента в множестве
ifJb=0thenB[Ib]:=B[Ib]+[Mm] //добавление простого числа
elseB[Ib+1]:=B[Ib+1]+[Jb];//в множество-результат
repeat // цикл нахождения минимального числа, содержащегося
M:=M+1;// в исходном множестве – нового простого числа
Si:=MdivMm;
Sj:=MmodMm;
if Sj=0 then I:=Si else I:=Si+1;
until (M>N)or(Sj in A[I]);
end;
{Печать полученного множества}
WriteLn(Rus('Простые числа из заданного диапазона'));
for I:=1 to Ib do
begin
for J:=1 to Mm do
if J in B[I] then Write((I-1)*Mm+J:4,' ');
ReadLn;
end;
if Jb<>0 then
for J:=1 to Mm do
if J in B[Ib+1] then Write (Ib*Mm+J:4,' ');
WriteLn;
ReadLn;
end.