Delphi: Как определить совершенное число?

Ответить
Lew
Сообщения: 1
Зарегистрирован: 26 апр 2009, 23:32

Уважаемые, нужна помощь в решении задач в Delphi, чтобы решить подобные.
1. Как составить программу, определяющую, является ли заданное число совершенным. Число называется совершенным, если оно равно сумме всех своих делителей, меньших, чем оно само. Например, число 28 совершенное: 28 =1+2+4+7+14.

[*удалено*]
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Перебираем все числа от 1 до заданного (N), проверяем каждое: если отстаток от деления =0 то суммируем. Потом сравниваем число с суммой.

Код: Выделить всё

S:=0;
for i:=1 to N do if (N mod i)=0 then inc(S,i);
if N=S 
   then writeln('Число совершенное')
   else writeln('Число несовершенное');

PS
По поводу суммы ряда: в этой теме не надо все смешивать. см. http://forum.developing.ru/tags.php?tag ... 0%FF%E4%E0 а также воспользуйтесь поиском. Это одна из самых частых здесь задач.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Naeel Maqsudov писал(а):Перебираем все числа от 1 до заданного (N), проверяем каждое: если отстаток от деления =0 то суммируем. Потом сравниваем число с суммой.
Только перебирать до (заданное минус один). А то так Вы нас всех совершенных чисел лишите :) )

Плюс крохотная оптимизация. Т.к. единица является делителем любого целого числа, то ее проверять не нужно, а сумму считать сразу с единицы.
UPD. Написал и подмуал, что при таком алгоритме получим краевой эффект для самой единицы, которая ошибочно окажется совершенным числом. Так что не стал это применять.

UPD2. На самом деле, вообще проверять можно числа даже не до (N-1), а до (N div 2). Т.к. очевидно, что среди чисел из диапазона [(N div 2) + 1 .. (N-1)] не найдется ни одного делителя числа N.

Код: Выделить всё

S:=0;
for i:=1 to (N div 2) do if (N mod i)=0 then inc(S,i);
if N=S 
   then writeln('Число совершенное')
   else writeln('Число несовершенное');
Ответить