https://leetcode.com/problems/perfect-number Easy

Условие

Дано целое число num. Нужно вернуть true, если num является совершенным числом, и false в противном случае. Число называется совершенным, если оно равно сумме всех своих делителей, кроме самого себя.

Примеры

Input: num = 28 Output: true Explanation: Делители числа 28 (кроме самого числа): 1, 2, 4, 7, 14. Их сумма равна 28, следовательно, число является совершенным.

Input: num = 7 Output: false

Решение

fun checkPerfectNumber(num: Int): Boolean {
    if (num <= 1) return false  // Число 1 и отрицательные числа не могут быть совершенными

    var sum = 1  // Начинаем с 1, так как это делитель для всех положительных чисел
    var i = 2

    // Находим делители до квадратного корня из числа без использования Math.sqrt
    while (i * i <= num) {
        if (num % i == 0) {
            sum += i  // Добавляем делитель
            if (i != num / i) {
                sum += num / i  // Добавляем соответствующий парный делитель, если он отличается
            }
        }
        i++
    }

    return sum == num  // Проверяем, равна ли сумма делителей самому числу
}

Временная сложность

O(√n), так как мы проверяем делители до квадратного корня num.

Пространственная сложность

O(1), так как используется только фиксированное количество дополнительных переменных.