Вивести числа из множества

Задание: Из данного множества вывести на экран все числа Мерсена, которые меньше N.(Простое число называется числом Мерсена если его можна представить в виде 2^p-1, где р также просто число). Вот зделал програмку, алгоритм такой:Если число находится в множестве, если оно больше N, и если оно не равно числу Мерсена, то исключаем его из сножестава, а потом выводим оставшееся множество...Только оно выводит все числа меньшие N хотя в условии проверки у меня есть проверка на число Мерсена, посмотрите плз,может что-то подскажете:program labn9; uses CRT; const a:array[1..10] of longint=(3,5,7,11,13,17,19,23,29,31 ); var st: set of byte; j,i,n,p: byte; l:real;begin ClrScr; Randomize; for i:=1 to 30 do st:=st+[Random(255)]; writeln(''); writeln('dannoe mnojestvo:'); writeln(''); for i:=0 to 255 do if i in st then writeln(i); writeln('');writeln('vvedite n'); readln(n);for j:=1 to 10 do begin p:=a[j];l:=exp(ln(2)*p)-1; for i:=0 to 255 do if (i in st) and (i>n) and (i<>l) then st:=st-[i] end; writeln('chisla Mersena menshie chisla N vyvedeny na ekrane:'); for i:=0 to 255 do if i in st then writeln(i);readln; end.
1 ответ

Проверку на соответствие рассматриваемого числа чичлу Марсена необходимо выполнять для каждого рассматриваемого числа:
for i:=0 to 255 do if (i in st) and (i>n) then
 for j:=1 to 10 do
 begin 
 p:=a[j];l:=exp(ln(2)*p)-1;
 if (i<>l) then st:=st-[i];
 end;