← Назад к вопросам

Разложение на простые множители

1.3 Junior🔥 121 комментариев
#Python Core

Условие

Напишите функцию, которая раскладывает число на простые множители.

Пример

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), что является стандартом для решения этой задачи на интервью.

Разложение на простые множители | PrepBro