Формулировка. Дано натуральное число. Проверить, является ли оно совершенным.
Примечание: совершенным числом называется натуральное число, равное сумме всех своих собственных делителей (то есть натуральных делителей, отличных от самого числа). Например, 6 – совершенное число, оно имеет три собственных делителя: 1, 2, 3, и их сумма равна 1 + 2 + 3 = 6.
Решение. Эта задача напоминает задачу 17, в которой нужно было найти количество всех натуральных делителей заданного числа. Напомним код ее основной части (назовем его кодом 1):
count := 0;
for i := 1 to n do begin
if n mod i = 0 then inc(count)
end;
Как видно, в этом цикле проверяется делимость числа n на все числа от 1 до n, причем при каждом выполнении условия делимости увеличивается на 1 значение счетчика count с помощью функции inc. Чтобы переделать этот код под текущую задачу, нужно вместо инкрементации (увеличения значения) переменной-счетчика прибавлять числовые значения самих делителей к некоторой переменной для хранения суммы (обычно ее мнемонически называют sum, что в пер. с англ. означает «сумма»). В связи с этим оператор
if n mod i = 0 then inc(count);
в коде 1 теперь уже будет выглядеть так:
if n mod i = 0 then sum := sum + i;
Кроме того, чтобы не учитывалось само число n при суммировании его делителей (насколько мы помним, этот делитель не учитывается в рамках определения совершенного числа), цикл должен продолжаться не до n, а до n – 1. Правда, если говорить точнее, то цикл следовало бы проводить до n div 2 (также это обсуждалось в задаче 15), так как любое число n не может иметь больших делителей, иначе частное от деления должно быть несуществующим натуральным число между 1 и 2.
Единственное, что останется теперь сделать – это вывести ответ, сравнив число n с суммой его делителей sum как результат булевского выражения через writeln:
writeln(n = sum);
Код:
- program PerfectNumbers;
- var
- i, n, sum: word;
- begin
- readln(n);
- sum := 0;
- for i := 1 to n div 2 do begin
- if n mod i = 0 then sum := sum + i
- end;
- writeln(n = sum)
- end.