program nname;
uses Crt;
var k,i,a,b,sum:longint;
f:Boolean;
begin
f:=False;
ClrScr;
Write('a=');
Readln(a);
Write('b=');
Readln(b);
for i:=a to b do
begin
sum:=0;
for k:=1 to i div 2 do
if i mod k=0 then sum:=sum+k;
if sum=i then
begin
if f=False then Writeln('Найдены совершенные числа на отрезке [a;b]:');
f:=True;
Write(i,' ');
end;
end;
if f=False then Writeln('Совершенных чисел на отрезке [a;b] не найдено!') else Writeln;
Readln;
end.
Следующий вариант
var
i, n: longint;
divider: integer;
bin, bs: integer;
bin_s: string;
a, b, check, s: LongInt;
begin
// writeln('from'); readln(a);
// writeln('to'); readln(b);
a := 10;
b := 50000000;
for bin := 1 to 14 do
begin
bin_s := '';
for bs := 1 to bin do bin_s := '1' + bin_s + '0';
bin_s := '1' + bin_s;
check := 0;
for i := 1 to length(bin_s) do check:= check * 2 + (ord(bin_s[i]) - ord('0'));
if check < a then continue;
if check > b then break;
s := 1;
for divider := 2 to trunc(sqrt(check)) do
begin
if check mod divider = 0 then
s := s + divider + (check div divider);
end;
if check = s then WriteLn(check);
end;
end.