Показать сообщение отдельно
Старый 19.03.2013, 19:47   #9 (permalink)
interacia
Member
 
Регистрация: 29.01.2013
Сообщений: 91
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 565
По умолчанию

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
interacia вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070