4) задание
// самый грубый способ вычисления.
Код:
Var
N,k:integer;
M,V:longInt;
Function Ideal(W:Integer):Boolean;
var
i,Sum:longInt;
begin
Sum:=0;
For i:=1 to W-1 do
If (W mod i)=0 then Inc(Sum,i);
Ideal:=(Sum=W);
end;
Begin
Write('M= ');
Readln(M);
V:=0;
For k:=2 to M do if Ideal(k) then V:=V+k;
Write('Сумма = ',V);
End.
Свойства совершенных четных чисел
1) Все чётные совершенные числа (кроме 6) являются суммой кубов последовательных нечётных натуральных чисел: 1^3+3^3+5^3 …
Еще свойство
2) могут быть представлены в виде n(2n−1) для некоторого натурального числа n.
Еще свойство
3) Все чётные совершенные числа, кроме 6 и 496, заканчиваются в десятичной записи на 16, 28, 36, 56 или 76.
Еще свойство
4) Все чётные совершенные числа в двоичной записи содержат сначала p единиц, за которыми следует p—1 нулей (следствие из их общего представления).
Это ещё не всё.
Эти свойства могут быть положены в основу облегчения алгоритма.
Для примера 1-ое свойство
Код
Код:
Var
N,k:integer;
j,M,V:longInt;
Function Ideal(W:Integer):Boolean;
var
i,Sum:longInt;
begin
Sum:=0;
For i:=1 to W-1 do
If (W mod i)=0 then Inc(Sum,i);
Ideal:=(Sum=W);
end;
Begin
Write('M= ');
Readln(M);
V:=0;
k:=1;
j:=3;
if M>=6 then
begin
V:=6;
while k<=M do
begin
if Ideal(k) then V:=V+k;
k:=k+j*j*j;
inc(j,2);
end;
end
else V:=0;
Write('Сумма = ',V);
End.
Между кодами существенная разница в производительности.
Если бы задача имела бы какое ни будь прикладное значение то эффективней использовать массив с уже просчитанными значениями.
Несколько первых значений
6, 28, 496, 8128, 33550336, 8589869056, 137438691328, 2305843008139952128, 2658455991569831744654692615953842176, 19156194260823610729479337808430363813099732154816 9216