
Определение всех делителей числа – частая задача в математике и программировании. В Python это можно сделать с помощью стандартных инструментов, не прибегая к сторонним библиотекам. Простое решение использует цикл и оператор остатка от деления %, проверяя, делится ли число на все значения от 1 до самого числа включительно.
Для оптимизации поиска делителей достаточно проверять числа до квадратного корня исходного значения. Если n % i == 0, то одновременно найден и парный делитель n // i, что сокращает количество итераций примерно в два раза. Это особенно важно при работе с большими числами, где полный перебор становится затратным.
Python предоставляет несколько подходов для хранения делителей. Самый простой – список, куда добавляются найденные значения. Можно использовать set для автоматического исключения дубликатов, что актуально при обработке квадратов чисел. При этом порядок элементов можно сохранить с помощью сортировки после вычисления.
В этом руководстве будут рассмотрены пошаговые методы: от базового перебора до оптимизированных функций с использованием генераторов списков и встроенных возможностей Python. Каждый подход сопровождается конкретными примерами кода и рекомендациями по выбору метода в зависимости от размера числа и целей задачи.
Использование цикла for для поиска всех делителей числа

Пример базового подхода:
n = 36
for i in range(1, n + 1):
if n % i == 0:
print(i)
В этом коде range(1, n + 1) обеспечивает проверку всех возможных делителей. Условие n % i == 0 гарантирует, что будут выведены только числа, полностью делящие n.
Для повышения эффективности достаточно проверять делители до int(n0.5) + 1. Каждый найденный делитель i добавляет также n // i в список делителей, если i не равно n // i. Это сокращает количество итераций примерно вдвое:
n = 36
divisors = []
for i in range(1, int(n0.5) + 1):
if n % i == 0:
divisors.append(i)
if i != n // i:
divisors.append(n // i)
divisors.sort()
print(divisors)
Использование цикла for в сочетании с проверкой до квадратного корня числа позволяет находить все делители быстро и без лишних вычислений, даже для больших чисел.
Поиск делителей через генераторы списков
Генераторы списков позволяют получить все делители числа в одной строке кода. Основная идея заключается в переборе диапазона чисел от 1 до самого числа и включении в результат только тех элементов, на которые исходное число делится без остатка.
Пример синтаксиса для числа n:
divisors = [i for i in range(1, n + 1) if n % i == 0]
В этом выражении i перебирает все значения от 1 до n, а условие if n % i == 0 отбирает только делители.
Для больших чисел можно сократить диапазон до int(n0.5) + 1 и добавлять соответствующие пары делителей, что ускоряет выполнение:
divisors = [i for i in range(1, int(n0.5) + 1) if n % i == 0]
Чтобы получить полный список, можно объединить пары i и n // i, проверяя, чтобы не было повторов при квадратных корнях.
Генераторы списков удобны для быстрых вычислений и позволяют легко интегрировать фильтры или дополнительные условия без необходимости использовать отдельные циклы.
Применение функции filter для отбора делителей

Функция filter позволяет выбрать элементы из итерируемого объекта на основе логической функции. Для поиска делителей числа n можно использовать filter вместе с функцией, проверяющей остаток от деления.
Пример: если у нас есть список чисел от 1 до n, функция lambda x: n % x == 0 вернёт только те элементы, которые делят n без остатка:
n = 36
divisors = list(filter(lambda x: n % x == 0, range(1, n+1)))
print(divisors)
Результат будет: [1, 2, 3, 4, 6, 9, 12, 18, 36].
Такой подход удобен при необходимости быстро отфильтровать делители из диапазона чисел без использования циклов. filter совместно с lambda делает код компактным и легко читаемым.
Для больших чисел рекомендуется ограничивать диапазон до int(n0.5)+1 и включать дополнительно парные делители, чтобы снизить количество проверок и ускорить выполнение:
n = 36
small_divisors = list(filter(lambda x: n % x == 0, range(1, int(n0.5)+1)))
all_divisors = small_divisors + [n//x for x in small_divisors if x != n//x]
all_divisors.sort()
print(all_divisors)
Результат совпадает с полным набором делителей, при этом функция filter используется только для части вычислений, что повышает эффективность.
Определение делителей с помощью модуля math

Модуль math позволяет ускорить поиск делителей числа за счёт использования функции sqrt(). Поскольку делители числа образуют пары, достаточно проверять делимость до квадратного корня числа.
Пример пошагового алгоритма:
- Импортировать модуль:
import math. - Вычислить целую часть квадратного корня числа:
limit = int(math.sqrt(n)). - Создать пустой список для делителей:
divisors = []. - Пройтись циклом по числам от 1 до
limitвключительно. - Для каждого числа проверить, делится ли
nбез остатка. Если да, добавить и его, и соответствующий парный делительn // i. - Отсортировать список делителей для удобного отображения.
Пример кода:
import math
n = 36
divisors = []
for i in range(1, int(math.sqrt(n)) + 1):
if n % i == 0:
divisors.append(i)
if i != n // i:
divisors.append(n // i)
divisors.sort()
print(divisors) # Результат: [1, 2, 3, 4, 6, 9, 12, 18, 36]
Этот метод сокращает количество итераций с n до примерно √n, что особенно важно для больших чисел. Рекомендуется использовать его для чисел свыше нескольких тысяч для оптимизации производительности.
Создание функции для возврата списка всех делителей
Для получения всех делителей числа удобнее использовать отдельную функцию. Она принимает число в качестве аргумента и возвращает список его делителей. Это позволяет многократно использовать один и тот же код без дублирования.
Пример функции на Python:
def get_divisors(n): divisors = [] for i in range(1, n + 1): if n % i == 0: divisors.append(i) return divisors |
Функция создаёт пустой список divisors, затем проверяет каждое число от 1 до n на делимость. Если остаток от деления равен нулю, число добавляется в список. В конце список возвращается как результат работы функции.
Пример вызова функции и использования результата:
num = 36 all_divisors = get_divisors(num) print(all_divisors) |
Для улучшения производительности можно проверять делители только до квадратного корня числа и добавлять пару делителей сразу:
import math def get_divisors(n): divisors = set() for i in range(1, int(math.sqrt(n)) + 1): if n % i == 0: divisors.add(i) divisors.add(n // i) return sorted(divisors) |
Сравнение методов поиска делителей на примерах
Рассмотрим число 36 и проверим, как разные методы находят его делители.
1. Цикл for: Перебор всех чисел от 1 до 36 с проверкой остатка. Результат: [1, 2, 3, 4, 6, 9, 12, 18, 36]. Метод простой, но при больших числах выполняется медленно, так как проверяет каждое число.
2. Генератор списков: [i for i in range(1, 37) if 36 % i == 0]. Синтаксис компактный, результат совпадает с циклом for. Эффективность схожа, скорость зависит от диапазона.
3. Функция filter: list(filter(lambda x: 36 % x == 0, range(1, 37))). Результат идентичен предыдущим методам. Код лаконичный, но использование lambda немного снижает читаемость для новичков.
4. Модуль math: Используем isqrt для перебора до квадратного корня: for i in range(1, math.isqrt(36)+1). Делители добавляются вместе с парными: i и 36//i. Результат: [1, 36, 2, 18, 3, 12, 4, 9, 6]. Метод быстрее при больших числах, так как проверяет меньше значений.
Вопрос-ответ:
Как с помощью Python найти все делители числа?
В Python для поиска всех делителей числа можно использовать цикл for с проверкой остатка от деления. Например, чтобы найти делители числа n, создаётся цикл от 1 до n включительно, и каждое число проверяется на условие n % i == 0. Все числа, при которых остаток равен нулю, добавляются в список делителей. Такой подход прост и подходит для чисел небольшого размера. Для оптимизации можно перебирать числа только до квадратного корня из n и сразу добавлять пару делителей.
Можно ли создать функцию, которая возвращает список всех делителей числа?
Да, в Python легко создать функцию, которая принимает число и возвращает список всех его делителей. Например, функция может использовать цикл for и условие проверки делимости. Внутри функции создаётся пустой список, затем все числа от 1 до n проверяются на условие n % i == 0, и подходящие числа добавляются в список. После завершения цикла функция возвращает готовый список. Такой подход позволяет многократно использовать код без повторения логики и легко интегрируется в другие программы.
