Все делители числа

Напечатай все натуральные делители данного числа.
Входные данные
n — натуральное число
Выходные данные
Делители числа n начиная с 1 заканчивая n, через пробел.
Для примера:
Ввод
10
Result
1 2 5 10
Решить с помощью while
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Почти все делители числа
Напечатай все натуральные делители числа n, кроме единицы и самого числа n. Входные данные n -.

Рекурсивно найти все делители числа
Собственно, задача в заголовке — необходимо рекурсивно найти все делители заданного числа.
Получить все делители числа q взаимно простые с p
Даны натуральные числа p и q. Получить все делители числа q взаимно просты с p.
Вывести все делители числа в порядке возрастания
Простыми называются такие натуральные числа, у которых ровно два делителя: 1 и само это число (они.
1183 / 759 / 277
Регистрация: 05.09.2021
Сообщений: 1,772

Сообщение было отмечено Shinskiy как решение
Решение
1 2 3
n = int(input()) while print(*filter(lambda x: not n % x, range(1, n + 1))): pass
Но если без шуток:
1 2 3 4 5 6
n = int(input()) m = 1 while m n: if not n % m: print(m, end=' ') m += 1
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
Как найти все делители большого числа?
Мне нужно найти все делители 20! * 21! и потом среди них найти кол-во делителей, которые являются.
Вывести все делители числа в порядке возрастания
Простыми называются такие натуральные числа, у которых ровно два делителя: 1 и само это число (они.
Получить все делители числа, используя цикл while
Вывести делители числа в строчку используя цикл while

Вывести все делители данного числа в порядке возрастания
Простыми называются такие натуральные числа, у которых ровно два делителя: 1 и само это число (они.
Вывести все натуральные делители числа x в порядке возрастания
И снова всем привет Понахватал хвостов к концу года, помогите( В этом году как то не идёт Нельзя.
Или воспользуйтесь поиском по форуму:
Как узнать все делители числа питон
![]()
Как найти все делители числа в Python
06 марта 2023
Оценки статьи
Еще никто не оценил статью
При работе с числами в Python часто требуется находить все делители заданного числа. Нахождение всех делителей может быть полезно для решения различных задач, таких как нахождение наибольшего общего делителя, проверка числа на простоту и т.д. В этой статье мы рассмотрим несколько способов нахождения всех делителей числа в Python.
Простой подход нахождения делителей
Простой подход заключается в переборе всех чисел от 1 до заданного числа n и проверке каждого числа на деление на n . Код для нахождения всех делителей числа n с помощью наивного подхода будет выглядеть следующим образом:
def find_divisors(n): divisors = [] for i in range(1, n+1): if n % i == 0: divisors.append(i) return divisors
Этот код работает корректно и находит все делители заданного числа. Однако, его сложность времени составляет O(n), что может быть неприемлемо для больших чисел.
Более оптимальный подход нахождения делителей
Второй способ нахождения всех делителей заключается в переборе только чисел от 1 до корня из заданного числа n. Если мы нашли делитель i , то мы также можем добавить в список делителей n/i . Код для нахождения всех делителей числа n с помощью более оптимального подхода будет выглядеть следующим образом:
import math def find_divisors(n): 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) return divisors
Этот код работает корректно и имеет сложность времени O(sqrt(n)) , что гораздо лучше, чем простой подход.
Решето Эратосфена в Python
Третий способ нахождения всех делителей заключается в нахождении всех простых делителей заданного числа и их степеней. Для нахождения простых делителей мы можем использовать Решето Эратосфена.
Затем мы будем проверять, на какие степени делятся каждый из простых делителей. Код для нахождения всех делителей числа n с помощью Решета Эратосфена будет выглядеть следующим образом:
def sieve_of_eratosthenes(n): primes = [True for i in range(n+1)] p = 2 while p**2 n: if primes[p]: for i in range(p**2, n+1, p): primes[i] = False p += 1 return [i for i in range(2, n+1) if primes[i]] def prime_factors(n): factors = [] primes = sieve_of_eratosthenes(n) for p in primes: while n % p == 0: factors.append(p) n //= p if n > 1: factors.append(n) return factors
Эти функции могут быть использованы для нахождения делителей любого целого числа. Например, для числа 12 результат работы этих функций будет таким:
>>> find_divisors(12) [1, 2, 3, 4, 6, 12] >>> prime_factors(12) [2, 2, 3]
Нахождение делителей числа с помощью Python
Вот проблема, которую я недавно пытался решить: дано целое число n, каковы все его делители?
Делитель, также известный как фактор или множитель, — это такое целое число m, на которое n делится без остатка. Например, делителями числа 12 являются 1, 2, 3, 4, 6 и 12.
В итоге я написал кое-что с помощью itertools, и в моем коде используется несколько интересных моментов из теории чисел. Я не знаю, буду ли я возвращаться к нему снова, но я надумал написать эту статью, потому что мои попытки решить озвученный выше вопрос перетекли в довольно забавное упражнение.
Простейший подход
Если мы хотим найти все числа, которые делят n без остатка, мы можем просто перебрать числа от 1 до n:
def get_all_divisors_brute(n): for i in range(1, int(n / 2) + 1): if n % i == 0: yield i yield nНа деле нам нужно дойти только до n/2, потому что все, что больше этого значения, гарантировано не может быть делителем n — если вы разделите n на что-то большее, чем n/2, результат не будет целым числом.
Этот код очень прост, и для малых значений n он работает достаточно хорошо, но он довольно неэффективен и медлителен в других случаях. По мере увеличения n время выполнения линейно увеличивается. Можем ли мы сделать лучше?
Факторизация
В моем проекте я работал в основном с факториалами. Факториал числа n, обозначаемый n! — это произведение всех целых чисел от 1 до n включительно. Например:
8! = 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1
Поскольку факториалы состоят преимущественно из небольших множителей, я решил попробовать получить список делителей, определив сначала наименьшие из них. В частности, я искал простые множители, то есть те, которые также являются простыми числами. (Простое число — это число, единственными делителями которого являются оно само и 1. Например, 2, 3 и 5 являются простыми, а 4 и 6 — нет).
Вот функция, которая находит простые делители числа n:
def get_prime_divisors(n): i = 2 while i * i 1: yield nЭто похоже на предыдущую функцию, использующую перебор делителей: мы продолжаем пробовать множители, и если находим подходящий, то делим на него. В противном случае мы проверяем следующее число. Это довольно стандартный подход к поиску простых множителей.
Теперь мы можем использовать этот метод для получения факторизации числа, то есть для его записи в виде произведения простых чисел. Например, факторизация числа 8! выглядит следующим образом:
8! = 2^7 × 3^2 × 5 × 7
Вычисление такой факторизации относительно эффективно, особенно для факториалов, так как, поскольку все простые множители очень малы, вам не нужно делать много делений.
В теории чисел есть утверждение, называемое основной теоремой арифметики, которое гласит, что простые факторизации (разложения) уникальны: для любого числа n существует только один способ представить его в виде произведения простых множителей. (Я не буду приводить здесь доказательство, но вы можете найти его в Википедии).
Это дает нам способ находить делители путем перебора всех комбинаций простых множителей. Простые множители любого m делителя числа n должны входить в подмножество простых множителей n, иначе m не делило бы число n.
Переход от факторизации к делителям
Для начала разложим исходное число на простые множители с указанием «кратности», то есть мы должны получить список всех множителей и количество раз, которое каждый из них встречается в факторизации:
import collections def get_all_divisors(n): primes = get_prime_divisors(n) primes_counted = collections.Counter(primes) .Затем, давайте продолжим и возведем каждое простое число во все степени, которые могут появиться в возможном делителе n.
def get_all_divisors(n): . divisors_exponentiated = [ [div ** i for i in range(count + 1)] for div, count in primes_counted.items() ]Например, для 8! представленный код выдаст нам следующее:
[ [1, 2, 4, 8, 16, 32, 64, 128], // 2^0, 2^1, . 2^7 [1, 3, 9], // 3^0, 3^1, 3^2 [1, 5], [1, 7], ]Затем, чтобы получить делители, мы можем использовать довольно удобную функцию itertools.product, которая принимает на вход итерабельные объекты и возвращает все возможные упорядоченные комбинации их элементов. В нашем случае она выбирает по одному числу из каждого списка с возведениями в степень, а затем, перемножая их вместе, мы получаем очередной делитель n.
import itertools def calc_product(iterable): acc = 1 for i in iterable: acc *= i return acc def get_all_divisors(n): . for prime_exp_combination in itertools.product(*divisors_exponentiated): yield calc_product(prime_exp_combination)Таким образом, мы находим все делители n (хотя, в отличие от предыдущих функций, они не отсортированы).
Собираем все вместе
Сложив все это, мы получим следующую функцию для вычисления делителей n:
import collections import itertools def get_prime_divisors(n): i = 2 while i * i 1: yield n def calc_product(iterable): acc = 1 for i in iterable: acc *= i return acc def get_all_divisors(n): primes = get_prime_divisors(n) primes_counted = collections.Counter(primes) divisors_exponentiated = [ [div ** i for i in range(count + 1)] for div, count in primes_counted.items() ] for prime_exp_combination in itertools.product(*divisors_exponentiated): yield calc_product(prime_exp_combination) print(list(get_all_divisors(40320))) # 8!Такая реализация очень эффективна, особенно когда у вас много маленьких простых множителей, как в случае с факториалами, с которыми я работал. Я не знаю, насколько хорошо она покажет себя в общем случае, и, если вы занимаетесь серьезными научными вычислениями, я уверен, что вы легко найдете уже реализованные и оптимизированные алгоритмы для такого рода вещей.
Как узнать все делители числа питон
23. Цикл while. Нахождение всех делителей числа
24. Цикл while. Инструкции break, continue, else
25. Функция range и итерируемые объекты
26. Цикл for. Обход элементов функции range
27. Цикл for. Обход списков и строк
28. Установка, настройка и использование PyCharm
29. Метод подсчета. Сортировка подсчетом Python
30. Вложенные циклы
31. Вложенные списки
Видео доступно только для спонсоров проекта
Посмотреть данное видео на Boosty на Patreon
Оформить спонсорскую подписку можно на Youtube Boosty Patreon
Цикл while. Нахождение всех делителей числа
В самом простом случаем для поиска всех делителей для числа n нужно обойти все числа в интервале от 1 до n и проверить каждое число, является ли оно делителем. Код такой программы представлен ниже:
Но количество повторений цикла в этой программе напрямую зависит от переменной n и если ввести достаточно большое число, программе потребуется много времени на выполнение.
Мы можем повысить эффективность этой программы. Для этого нужно понимать, что самым большим делителем у любого числа является само это число. А вторым по старшинству делителем для четных чисел будет половина нашего исходного числа, а для нечетных - еще меньше чем половина. Значит мы можем искать делители в цикле на интервале от 1 до n//2 и после цикла выводить само число.
Эффективность этой программы увеличилась в 2 раза, но все же при вводе больших значений, программа будет долго работать.
Поэтому мы напишем ее следующим образом. Если мы знаем один делитель числа, то с легкостью можем найти второй делитель. Например, если мы знаем, что 2 является делителем числа 50, то деля 50 на 2, получаем еще один делитель 25. Значит мы можем искать предполагаемый первый делитель на интервале от 1 до корень из n (подробности в видео).








