← Назад к вопросам
Разложение на простые множители
1.3 Junior🔥 121 комментариев
Условие
Напишите функцию, которая раскладывает число на простые множители.
Пример
factorize(12) → [2, 2, 3] factorize(100) → [2, 2, 5, 5] factorize(17) → [17]
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Разложение на простые множители
Описание
Эта задача требует найти все простые множители числа и вернуть их в виде списка.
Решение 1: Базовый подход (пробное деление)
def factorize(n):
"""Раскладывает число на простые множители."""
factors = []
while n % 2 == 0:
factors.append(2)
n = n // 2
divisor = 3
while divisor * divisor <= n:
while n % divisor == 0:
factors.append(divisor)
n = n // divisor
divisor += 2
if n > 1:
factors.append(n)
return factors
print(factorize(12)) # [2, 2, 3]
print(factorize(100)) # [2, 2, 5, 5]
print(factorize(17)) # [17]
Временная сложность: O(√n) в худшем случае.
Решение 2: Оптимизированное пробное деление
def factorize(n):
"""Оптимизированная версия с проверкой до √n."""
if n < 2:
return []
factors = []
while n % 2 == 0:
factors.append(2)
n //= 2
i = 3
while i * i <= n:
while n % i == 0:
factors.append(i)
n //= i
i += 2
if n > 1:
factors.append(n)
return factors
Решение 3: Рекурсивный подход
def factorize(n, divisor=2):
"""Рекурсивное разложение на множители."""
if n < 2:
return []
if divisor * divisor > n:
return [n]
if n % divisor == 0:
return [divisor] + factorize(n // divisor, divisor)
return factorize(n, divisor + 1)
Решение 4: Со словарём для подсчёта множителей
def factorize_dict(n):
"""Возвращает множители в виде словаря."""
factors = {}
divisor = 2
while divisor * divisor <= n:
while n % divisor == 0:
factors[divisor] = factors.get(divisor, 0) + 1
n //= divisor
divisor += 1
if n > 1:
factors[n] = factors.get(n, 0) + 1
return factors
Рекомендуемое решение для интервью
def factorize(n: int) -> list[int]:
"""Раскладывает число на простые множители за O(√n) время."""
if n < 2:
return []
factors = []
while n % 2 == 0:
factors.append(2)
n //= 2
divisor = 3
while divisor * divisor <= n:
while n % divisor == 0:
factors.append(divisor)
n //= divisor
divisor += 2
if n > 1:
factors.append(n)
return factors
Это решение демонстрирует понимание алгоритма и имеет оптимальную временную сложность O(√n), что является стандартом для решения этой задачи на интервью.
Похожие вопросы
- Замена пробелов в строке
- Сериализация и десериализация (pickle)
- Топ K частых элементов
- Поиск начала цикла в связном списке
- Определение цикла в связном списке
- Проверка гипотезы Коллатца
- Сбалансированные скобки
- Декодирование строки
- Поиск слова в матрице (Word Search)
- Flatten вложенного списка
- Конвертация римских чисел
- Удаление символа из строки
- Разворот строки
- Поиск дубликатов в массиве
- Самая длинная возрастающая подпоследовательность
- Группировка данных с pandas
- Наибольший прямоугольник в гистограмме
- Вычисление выражения в обратной польской записи
- Сжатие строки (Run-Length Encoding)
- Поиск медианы двух отсортированных массивов