Разбор задачи: Самоделящиеся числа

Предложенный нами код решения:

def self_dividing_numbers(left: int, right: int) -> list:
    """
    :param left: Начало диапазона (включительно).
    :param right: Конец диапазона (включительно).
    :return: Список самоделящихся чисел в диапазоне [left, right].
    """
    return [
        num for num in range(left, right + 1)
        if all(d != '0' and num % int(d) == 0 for d in str(num))
    ]

Подробное объяснение кода

return [
    num for num in range(left, right + 1)  # Итерируем числа в заданном диапазоне
    if all(d != '0' and num % int(d) == 0 for d in str(num))  # Условие фильтрации
]

Разберем каждую часть:

  1. range(left, right + 1):
    • Генерирует все числа в диапазоне от left до right включительно.
  2. Генератор списка: [num for num in range(...)]:
    • Формирует итоговый список, добавляя в него только те числа, которые проходят проверку в блоке if.
  3. str(num):
    • Преобразует число в строку, чтобы можно было итерировать по его цифрам.
  4. all(...):
    • Проверяет, что все условия внутри выполнены:
      • d != '0':
        • Убедиться, что цифра не равна '0'. Если в числе есть 0, оно автоматически не является самоделящимся, так как деление на 0 невозможно.
      • num % int(d) == 0:
        • Проверяет, делится ли число num на цифру d без остатка.

Пример работы функции

  1. Пример 1:

    left = 1
    right = 22
    
    • Диапазон: [1, 22].
    • Проверяем каждое число:
      • 1 → делится на 1.
      • 2 → делится на 2.
      • ...
      • 12 → делится на 1 и 2.
      • 22 → делится на 2 и 2.
    • Результат: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15, 22].
  2. Пример 2:

    left = 47
    right = 85
    
    • Диапазон: [47, 85].
    • Проверяем каждое число:
      • 48 → делится на 4 и 8.
      • 55 → делится на 5 и 5.
      • ...
      • 77 → делится на 7 и 7.
    • Результат: [48, 55, 66, 77].

 



Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии