Страница 1 из 1

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

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

[*удалено*]

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

Добавлено: 27 апр 2009, 00:22
Naeel Maqsudov
Перебираем все числа от 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 а также воспользуйтесь поиском. Это одна из самых частых здесь задач.

.

Добавлено: 27 апр 2009, 12:04
BBB
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('Число несовершенное');