Skip to content

Instantly share code, notes, and snippets.

@ernado
Created September 18, 2011 08:11
Show Gist options
  • Save ernado/1224868 to your computer and use it in GitHub Desktop.
Save ernado/1224868 to your computer and use it in GitHub Desktop.
Совершенные числа
var {Разумов 11Г}
m,n,i,j,p,st,k,c:longint;
a:array[1..10] of longint;
f:boolean;
begin
{переберем коэффициенты}
j:=0;
read(m,n);
{16 - такой коэффициент, что последнее найденное совершенное число будет послед
ним, входящим в промежуток}
for p:=2 to 16 do begin
k:=2;
f:=true;
{протестируем их на простоту тестом Люка-Лемера}
for i:=2 to trunc(sqrt(p)) do
if (p mod i) = 0 then f:=false;
{Найдем числа Мерсена и подставим в алгоритм Евклида }
{т.е. c=Mr*(Mr-1)= 2^(p-1) * (2^p-1) }
if f then begin
for st:=2 to p do k:=k*2;
c:=(k div 2)*(k-1);
inc(j);
a[j]:=c;
end;
end;
f:=false;
{перебор всех совершенных на соответствие промежутку}
for i:=1 to j do begin
c:=a[i];
if (c>=m) and (c<=n) then begin {соотв. промежутку [m;n]}
f:=true; {флаг нахождения}
writeln(c);
end;
end;
if not f then WriteLn('Absent');
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment