Решение задачи №4039
Условие задачи №4039:
Условие: Дано натуральное число. Проверить, является ли оно совершенным.Примечание: совершенным числом называется натуральное число, равное сумме всех своих собственных делителей (то есть натуральных делителей, отличных от самого числа). Например, 6 – совершенное число, оно имеет три собственных делителя: 1, 2, 3, и их сумма равна 1 + 2 + 3 = 6.
Решение
Описание отсутствуетРешение:
Эта задача напоминает задачу 17 (/show-so...), в которой нужно было найти количество всех натуральных делителей заданного числа. Напомним код ее основной части (назовем его кодом 1):
1 2 3 4 | 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, что в пер. с англ. означает «сумма»). В связи с этим оператор
1 | if n mod i = 0 then inc(count); |
в коде 1 теперь уже будет выглядеть так:
1 | if n mod i = 0 then sum := sum + i; |
Кроме того, чтобы не учитывалось само число n при суммировании его делителей (насколько мы помним, этот делитель не учитывается в рамках определения совершенного числа), цикл должен продолжаться не до n, а до n – 1. Правда, если говорить точнее, то цикл следовало бы проводить до n div 2 (также это обсуждалось в задаче 15 (/show-so...)), так как любое число n не может иметь больших делителей, иначе частное от деления должно быть несуществующим натуральным число между 1 и 2.
Единственное, что останется теперь сделать – это вывести ответ, сравнив число n с суммой его делителей sum как результат булевского выражения через writeln:
1 | writeln(n = sum); |
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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. |