Постановка проблемы
Учитывая целое число N
Отказ
Получить все делители C
числа N
так что слияние *
для другого целого числа Я
Отказ Желаемый выходной формат представляет собой список целых чисел (делитель).
Вот несколько примеров:
n = 10 # Output: [1, 2, 5, 10] n = 13 # Output: [1, 13] n = 24 # Output: [1, 2, 3, 4, 6, 8, 12]
Метод 1: наивный подход
Целое число Я
это делитель N
Если N Modulo I
равен нулю
Мы используем это наблюдение в функции делители ()
Отказ Мы создаем изначально пустую Список Результат
и проверьте на каждый целочисленный номер Я
между 0. и N/2
Является ли этот номер делителем N
Отказ Если это так, мы присоединиться к это в список.
Следующий код Python выполняет это:
def divisors(n): result = [] for i in range(1, n//2 + 1): if n % i == 0: result.append(i) result.append(n) return result print(divisors(24)) # [1, 2, 3, 4, 6, 8, 12, 24]
Этот подход не очень эффективен, потому что мы проходим каждое число от 0 до N/2.
Отказ Если число n становится большим, таким как n = 1000000.
нам нужно проверить каждый номер I = 0 ,,, ...,
Отказ
Сложность выполнения: Сложность выполнения вычисления делителей числа N это На) Используя этот подход, предполагая, что операция модуля может быть выполнена на одном шаге.
Можем ли мы сделать лучше? Да!
Способ 2: уменьшение количества петлевых итераций
Мы используем два наблюдения для уменьшения количества петлевых итераций «наивного алгоритма».
Наблюдение 1: Если номер Я
это делитель N
, номер J/I
должен быть целым числом и делитель N
а также потому, что Я *
Отказ Это означает, что каждый раз мы находим делитель Я
, мы также можем добавить дивизор N/I
к списку делителей.
Наблюдение 2: Для пары N
-дивизор (Я, j)
Один из них должен быть меньше или равен квадратному корню N
Отказ Причина проста: если оба были больше квадратного корня, умножение I * J
будет больше, чем N
наверняка, потому что root (n) * root (n)
Отказ Таким образом, мы можем пройти потенциальные делители от I = 0
к i = root (n)
И обязательно нашли все делители. Это экономит нам все итерации от i = root (n)
к I = N//2
Отказ
Вот простой твик со значительными преимуществами производительности:
def divisors(n): result = set() for i in range(1, int(n**0.5)+1): if n % i == 0: result.add(i) result.add(n//i) return list(result) print(divisors(24)) # [1, 2, 3, 4, 6, 8, 12, 24]
Этот код илетет только от 0 до квадратного корня числа N
Отказ Если мы найдем делитель Я
мы также добавляем н//я
который является другим фактором и делитель N
также.
Сложность выполнения: Сложность выполнения вычисления делителей числа N это O (n ^ 0,5) Используя этот подход, предполагающий, что операция по модулю учитывается как один шаг.
Куда пойти отсюда?
Достаточно теории, давайте познакомимся!
Чтобы стать успешным в кодировке, вам нужно выйти туда и решать реальные проблемы для реальных людей. Вот как вы можете легко стать шестифункциональным тренером. И вот как вы польские навыки, которые вам действительно нужны на практике. В конце концов, что такое использование теории обучения, что никто никогда не нуждается?
Практические проекты – это то, как вы обостряете вашу пилу в кодировке!
Вы хотите стать мастером кода, сосредоточившись на практических кодовых проектах, которые фактически зарабатывают вам деньги и решают проблемы для людей?
Затем станьте питоном независимым разработчиком! Это лучший способ приближения к задаче улучшения ваших навыков Python – даже если вы являетесь полным новичком.
Присоединяйтесь к моему бесплатным вебинаре «Как создать свой навык высокого дохода Python» и посмотреть, как я вырос на моем кодированном бизнесе в Интернете и как вы можете, слишком от комфорта вашего собственного дома.
Присоединяйтесь к свободному вебинару сейчас!
Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.
Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.
Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.