gray621 36 / 51 / 11 Регистрация: 14.01.2021 Сообщений: 406 |
||||
1 |
||||
Найти число по количеству делителей17.01.2021, 19:52. Показов 9344. Ответов 14 Метки python 3, питон (Все метки)
Формат ввода Формат вывода Пример 1 Вот код, чтобы найти кол-во делителей числа, а как наоборот?
0 |
unfindable_404 690 / 473 / 204 Регистрация: 22.03.2020 Сообщений: 1,052 |
||||
17.01.2021, 20:32 |
2 |
|||
На основе вашего кода:
1 |
7256 / 4045 / 1780 Регистрация: 27.03.2020 Сообщений: 6,871 |
|
17.01.2021, 20:42 |
3 |
gray621, подсказка — количество делителей :
1 |
gray621 36 / 51 / 11 Регистрация: 14.01.2021 Сообщений: 406 |
||||
17.01.2021, 20:52 [ТС] |
4 |
|||
divs = int(input()) Спасибо, у меня не получалось придумать ещё n, а так всё такое же. Добавлено через 5 минут
Код не работает на 18 тесте, превышен лимит времени, можно как-то ускорить цикл?
0 |
7256 / 4045 / 1780 Регистрация: 27.03.2020 Сообщений: 6,871 |
|
17.01.2021, 21:06 |
5 |
gray621, ограничения на «n» есть ?
0 |
36 / 51 / 11 Регистрация: 14.01.2021 Сообщений: 406 |
|
17.01.2021, 21:23 [ТС] |
6 |
ограничения на «n» есть ? Нет, но есть ограничение на время 1 секунда, а тест идёт 1064 ms, то есть нужно ускорить цикл немножко. Добавлено через 15 минут
0 |
3483 / 2090 / 560 Регистрация: 02.09.2015 Сообщений: 5,335 |
|
17.01.2021, 21:35 |
7 |
Нарыл решение Но оно не удовлетворяет условию:
При решении нельзя использовать функции и методы, а также списки и словари. В т. ч. мемоизация.
0 |
Gdez 7256 / 4045 / 1780 Регистрация: 27.03.2020 Сообщений: 6,871 |
||||
17.01.2021, 22:08 |
8 |
|||
Решениеgray621, если не ошибся
Добавлено через 7 минут
1 |
Arsegg |
17.01.2021, 22:34
|
Не по теме:
Если интересует, то возможно найду задачу на кодфорс. Полагаю, задача div1.
0 |
gray621 36 / 51 / 11 Регистрация: 14.01.2021 Сообщений: 406 |
||||
17.01.2021, 22:49 [ТС] |
10 |
|||
divs = int(input()) А почему там n в корень возводится, а не пополам делится? Добавлено через 5 минут
?
0 |
7256 / 4045 / 1780 Регистрация: 27.03.2020 Сообщений: 6,871 |
|
17.01.2021, 23:11 |
11 |
Arsegg, Добавлено через 5 минут А почему там n в корень возводится, а не пополам делится? Потому что это не слагаемые, а делители. Допустим для 40 не нужно искать делители больше 6, сразу считать парами — 1 и 40, 2 и 20, 4 и 10, 5 и 8; всего 8 делителей. Добавлено через 5 минут
2 |
36 / 51 / 11 Регистрация: 14.01.2021 Сообщений: 406 |
|
17.01.2021, 23:25 [ТС] |
12 |
если число не квадрат другого числа, то количество делителей четное То есть у квадратов чисел корни натуральные числа?
0 |
7256 / 4045 / 1780 Регистрация: 27.03.2020 Сообщений: 6,871 |
|
17.01.2021, 23:41 |
13 |
gray621, нет Добавлено через 2 минуты
0 |
gray621 36 / 51 / 11 Регистрация: 14.01.2021 Сообщений: 406 |
||||||||
18.01.2021, 00:14 [ТС] |
14 |
|||||||
Когда найдешь код, который пройдет все тесты Твой код прошёл Добавлено через 15 секунд
Когда найдешь код, который пройдет все тесты Твой код прошёл Добавлено через 10 секунд
Когда найдешь код, который пройдет все тесты Твой код прошёл Добавлено через 22 минуты
И ещё почему в range + 1?
0 |
Gdez 7256 / 4045 / 1780 Регистрация: 27.03.2020 Сообщений: 6,871 |
||||
18.01.2021, 04:38 |
15 |
|||
gray621, Зачем проверка для чётного кол-во делителей Потому что для четных диапазон :
Для нечетных изначально можно не включать значение корня (для 36 число 6 уже входит -> count_of_dividers = 1)
1 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
18.01.2021, 04:38 |
Помогаю со студенческими работами здесь Дано число P, нужно найти число от 1 до Р, с наибольшим количеством делителей int p; Дано натуральное число N. Найти число от 1 до N с максимальной суммою делителей Формат входных… Дано натуральное число n. Найти число от 1 до n, имеющий как можно большее сумму делителей . Найти число всех натуральных делителей числа , которые не превосходят это число и взаимно простых с ним: а) 720, б) 3179, в) 6615 Перестановка элементов массива по количеству делителей
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 15 |
I’m trying to create a function that returns the integer with most divisors when provided with a list.
def number_of_divisors(k):
count = 0
for number in range(1, k+1):
if k % number == 0:
count += 1
return count
def max_divisors(list_i):
return(max(list_i, key = number_of_divisors))
This function works perfectly fine. But if provided with a list like [8,12,18,6], 12 and 18 are tied for maximum number of divisors. It only returns the first item with maximum number of divisors i.e. 12. I want it to return 18 as well. How to achieve this?
DevLounge
8,2833 gold badges30 silver badges44 bronze badges
asked Mar 24, 2017 at 19:15
2
You are going to have to collect all the results, and you can use a dictionary to map the number of divisors to the numbers and just return that list of numbers, e.g.:
def max_divisors(list_i):
d = {}
for n in list_i:
d.setdefault(number_of_divisors(n), []).append(n)
return d[max(d)]
>>> max_divisors([8,12,18,6])
[12, 18]
answered Mar 24, 2017 at 19:25
AChampionAChampion
29.4k3 gold badges58 silver badges73 bronze badges
2
You could rewrite your max_divisors
function like this:
def max_divisors(items):
div_list = list(map(number_of_divisors, items))
most = max(div_list)
return [items[i] for i, div in enumerate(div_list) if div == most]
The first line generates a list of divisors corresponding to your items, so that div_list[i]
is equal to the number of divisors of the number at items[i]
. The second line finds the maximum number of divisors, and the third line marches through your divisors list and adds the corresponding number to the return list only if it has the maximum number of divisors.
The third line contains an example of a Python list comprehension; since you’re a beginner you may not have seen one of these before. Its general form is
[item for item in sequence if cond]
an expression which is equivalent to filtered
in the more verbose code below
filtered = []
for item in sequence:
if cond:
filtered.append(item)
Note that both the item
and cond
field in the list comprehension can be any Python expression.
answered Mar 24, 2017 at 19:29
iafisheriafisher
9287 silver badges14 bronze badges
1
На чтение 6 мин Просмотров 2.1к. Опубликовано
При работе с числами в программировании зачастую бывает нужно найти количество делителей для данного числа. Например, при работе с задачами на поиск простых чисел или при вычислении наибольшего общего делителя. В этой статье мы рассмотрим несколько способов, как найти количество делителей числа в языке программирования Python.
Содержание
- Что такое делители числа
- Нахождение количества делителей числа с помощью цикла и проверки на остаток от деления
- Нахождение количества делителей числа с помощью математических свойств чисел
- Используем свойство: Если число n имеет делитель d, то оно также имеет делитель n/d
- Используем разложение на простые множители
Что такое делители числа
В математике делителем натурального числа называют все числа, на которые это число делится без остатка. Например, делителями числа 12 являются числа 1, 2, 3, 4, 6 и 12, так как 12 делится на каждое из этих чисел без остатка. Количество делителей числа может быть разным в зависимости от самого числа. Например, у числа 12 имеется 6 делителей, а у числа 17 только 2 делителя (1 и само число).
Нахождение количества делителей числа с помощью цикла и проверки на остаток от деления
Для нахождения количества делителей числа можно использовать цикл и проверку на остаток от деления. Идея заключается в том, что мы перебираем все числа от 1 до самого числа и проверяем, делится ли число на каждое из этих чисел без остатка. Если да, то это число является делителем и мы увеличиваем счетчик делителей на 1.
Вот пример кода на Python, который иллюстрирует этот подход:
num = int(input("Введите число: "))
count = 0
for i in range(1, num+1):
if num % i == 0:
count += 1
print("Количество делителей числа", num, "равно", count)
В этом примере мы сначала запрашиваем у пользователя число, затем проходим по всем целым числам от 1 до введенного числа (включительно) с помощью цикла for. Для каждого числа в этом диапазоне мы проверяем, является ли оно делителем введенного числа (то есть, делится ли число нацело на i). Если да, то увеличиваем счетчик делителей на 1. В конце выводим количество найденных делителей на экран.
Такой подход работает для любых чисел, включая большие числа. Однако, при больших числах он может работать медленно, поскольку требует перебора всех чисел от 1 до n
. Далее мы рассмотрим более эффективные способы нахождения количества делителей числа.
Нахождение количества делителей числа с помощью математических свойств чисел
Используем свойство: Если число n имеет делитель d, то оно также имеет делитель n/d
Данный способ основан на математическом свойстве, что если число n имеет делитель d, то оно также имеет делитель n/d. Исходя из этого свойства, можно заметить, что достаточно искать делители только до квадратного корня числа n, так как все остальные делители можно получить путем деления n на найденный делитель до квадратного корня.
Таким образом, для нахождения всех делителей числа n, мы можем использовать цикл от 1 до int(sqrt(n))+1, и проверять, является ли i делителем n, если да, то добавлять i и n/i в список делителей.
Например, для числа n=100, квадратный корень из него равен 10. Поэтому, достаточно проверить делители от 1 до 11 (включая 10). Если делитель найден, то мы можем добавить его и соответствующий делитель, найденный путем деления n на найденный делитель, в список делителей. Таким образом, делители числа 100 будут: [1, 2, 4, 5, 10, 20, 25, 50, 100].
Вот пример кода на Python, который использует данный подход
import math
def count_divisors(num):
# Инициализация счетчика делителей
div_count = 0
# Находим квадратный корень из числа
sqrt_num = int(math.sqrt(num))
# Проверяем числа от 1 до квадратного корня num
for i in range(1, sqrt_num + 1):
if num % i == 0:
# Если i является делителем, увеличиваем счетчик на 1
div_count += 1
# Проверяем, является ли num/i также делителем (чтобы избежать дублирования)
if i != num // i:
div_count += 1
# Возвращаем общее количество делителей
return div_count
Эта функция принимает один аргумент num
, который является целым числом. Она использует функцию sqrt()
из модуля math
, чтобы найти квадратный корень из числа, и затем проверяет все числа от 1 до этого корня на предмет деления на num
. Если число делится без остатка, оно добавляется к счетчику делителей div_count
. Затем функция проверяет, является ли num
делителем num/i
, чтобы избежать дублирования. Наконец, функция возвращает общее количество делителей.
Данный способ эффективнее, чем перебор всех чисел до n-1, так как число проверок уменьшается в два раза. Однако, при использовании больших чисел, лучше использовать другие методы, например, разложение на простые множители.
Используем разложение на простые множители
Другой способ нахождения количества делителей числа заключается в использовании его математических свойств. Если мы знаем разложение числа на простые множители, то количество делителей числа можно легко вычислить.
Действительно, пусть дано число n = p_1^k_1 * p_2^k_2 * … * p_m^k_m, где p_1, p_2, …, p_m — простые числа, а k_1, k_2, …, k_m — их степени. Тогда каждый делитель числа n можно представить в виде d = p_1^i_1 * p_2^i_2 * … * p_m^i_m, где 0 <= i_j <= k_j для всех j от 1 до m. Таким образом, общее количество делителей числа n равно произведению (k_1 + 1) * (k_2 + 1) * … * (k_m + 1).
Для примера, давайте рассмотрим число 24. Его разложение на простые множители выглядит так: 24 = 2^3 * 3^1. Тогда количество делителей числа 24 равно (3 + 1) * (1 + 1) = 8. Это означает, что у числа 24 есть 8 делителей, а именно: 1, 2, 3, 4, 6, 8, 12 и 24.
Для вычисления количества делителей числа с помощью его разложения на простые множители в Python, нам необходимо воспользоваться функцией factorize() из библиотеки sympy. Она разлагает число на простые множители и возвращает список кортежей, каждый из которых содержит простой множитель и его степень. Затем мы можем вычислить количество делителей по формуле, описанной выше, и вернуть результат.
Вот пример кода, использующий функцию factorize()
из библиотеки sympy
для нахождения количества делителей числа:
from sympy import factorint
def count_divisors(n):
factors = factorint(n)
count = 1
for factor in factors.values():
count *= (factor + 1)
return count
n = 24
print(f"Количество делителей числа {n}: {count_divisors(n)}")
Здесь мы сначала импортируем функцию factorint()
из библиотеки sympy
. Затем определяем функцию count_divisors()
, которая принимает на вход число n
и возвращает количество его делителей. Внутри функции мы используем функцию factorint()
для разложения числа на простые множители и получаем словарь, где ключами являются простые множители, а значениями — их степени. Далее мы вычисляем количество делителей числа с помощью формулы, основанной на свойствах простых множителей, и возвращаем результат.
Затем мы просто вызываем функцию count_divisors()
для числа 24 и выводим результат на экран. В данном случае результат будет равен 8, что соответствует количеству делителей числа 24 (1, 2, 3, 4, 6, 8, 12 и 24).
День!
решая задачу пришлось найти в сети алгоритм поиска всех делителей числа.
ну то есть для восьми надо выдать [1,2,4,8], а не [2,2,2] — список делителей. Я переписал этот алгоритм наново, прошу «старших товарищей» подсказать как улучшить. Если есть время ))
def divisorss(n):
from collections import Counter
ls = get_ls(n) # for n=1568 -> ls = [2, 2, 2, 2, 2, 7, 7]
pairs = dict(Counter(ls)) # {2: 5, 7: 2}
from itertools import product, starmap
from operator import mul
from functools import reduce
# список всех различных делитей числа
bases = [b for b in pairs.keys()] # [2, 7]
# список степеней, в которые возводятся уникальные делители для получения числа
powers = [[i for i in range(k+1)] for k in pairs.values()]
# генерирование всех наборов для получения делителей исходного числа
multi = product(*powers)
# сцепка списка оснований с возможными вариантами степеней
wrk = (zip(bases,power) for power in multi)
# наборы чисел, которые нужно перемножить для получения делителя
rezzz = (starmap( pow, row) for row in wrk)
# возвращение списка всех делителей
return [reduce(mul,i) for i in rezzz]
например divisorss(1568)
возвращает [1, 7, 49, 2, 14, 98, 4, 28, 196, 8, 56, 392, 16, 112, 784, 32, 224, 1568]
Функция get_ls(n)
дает соответственно список разложения числа на произведение делителей
например такая:
def get_ls(n):
"""Разложить число на множители"""
#result = [1]
result = []
i = 2
while i*i <= n:
if n % i == 0:
n //= i
result.append(i)
else:
i += 1
if n > 1:
result.append(n)
return result
что можно улучшить?
Ну например, что лучше — reduce из functools или accumulate из itertools. Ну и вообще по алгоритму.
Понятно, что улучшения типа
return [reduce(mul,i) for i in (starmap(pow, row) for row in (zip(bases,power) for power in product(*powers)))]
не интересны.
Делитель — это число, на которое нацело делится делимое. У делимого может быть один или несколько делителей, найти их все можно с помощью простого алгоритма, который без проблем реализуется на Python 3.
Нахождение делителей числа
С практической точки зрения будет полезно, если программа на Python не только будет находить делители числа, искать их сумму, определять минимальный и максимальный, а также простые делители.
Каждая подзадача так или иначе связана с предыдущей, поэтому код последующей программы — это немного модернизированный код предыдущей. Кроме того, весь функционал при необходимости можно объединить в одной программе.
Алгоритм нахождения очень простой. В цикле перебираются значения от делимого минус единица до двух включительно. Если делимое нацело делится на текущее значение, то оно является делителем.
Пользователь вводит целое число, делителей которого будет искать программа, тогда код выглядит так:
numb = int(input("Введите целое число: ")) print("Результат:", end = " ") for i in range(numb - 1, 1, -1): if (numb % i == 0): print(i, end = " ")
Например, пользователь ввёл число 625. Программа начинает цикл со значения 624, в цикле проверяется, делится ли нацело 625 на 624, затем цикл переходит на следующую итерацию и работает уже с числом 623 и так до двух. Таким образом, вывод программы будет следующим:
Введите целое число: 625 Результат: 125 25 5
Простые делители числа
Простой делитель — это делитель, который делится только на единицу и самого себя. Для нахождения простых делителей с помощью Python нужно немного модернизировать программу, добавив в неё дополнительный цикл for и переменную счётчик.
Программа построена по следующему алгоритму:
- Обнулить счётчик.
- В цикле искать делители.
- Если найден, искать во вложенном цикле его делители. Это для того, чтобы определить: является ли он простым.
- Если найден, увеличить счётчик.
- Если счётчик равен нулю, то число простое и надо вывести значение делителя в консоль.
- Перейти на следующую итерацию внешнего цикла.
Цикл теперь выглядит так:
numb = int(input("Введите целое число: ")) print("Простые:", end = " ") for i in range(numb - 1, 1, -1): is_simple = 0 # Счётчик if (numb % i == 0): for j in range(i - 1, 1, -1): if (i % j == 0): is_simple = is_simple + 1 # Увеличиваем, если находим делитель if (is_simple == 0): # Если делителей не было найдено, выводим print(i, end = " ")
Понятно, что если значение счётчика больше нуля — то число точно не простое. Можно оптимизировать немного код и сразу завершать вложенный цикл после увеличения счётчика. Для этого можно воспользоваться оператором break
в условном операторе, находящемся во вложенном цикле.
Результат работы программы:
Введите целое число: 63 Простые: 7 3
Делители расположены в порядке убывания. И если надо вывести только самый большой простой делитель с помощью Python, то можно после того, как выведется первое число, воспользоваться оператором break
для выхода из цикла.
Сумма делителей
Для того чтобы найти сумму всех делителей числа с помощью Python, достаточно добавить в начальную программу переменную, к которой в цикле будет прибавляться каждый найденный делитель.
Код программы:
numb = int(input("Введите целое число: ")) sum_of_dividers = 0 for i in range(numb - 1, 1, -1): if (numb % i == 0): sum_of_dividers += i print("Сумма:", sum_of_dividers)
Результат выполнения кода:
Введите целое число: 63 Сумма: 40
Количество делителей
Этот вариант программы также лишь незначительно отличается от изначального. Для подсчёта делителей нужно ввести переменную-счётчик, к которой будет прибавляться единица каждый раз, когда условие «numb % i == 0
» будет выполняться.
numb = int(input("Введите целое число: ")) count_of_dividers = 0 for i in range(numb - 1, 1, -1): if (numb % i == 0): count_of_dividers += 1 print("Количество равно:", count_of_dividers)
Результаты выполнения программы:
Введите целое число: 63 Количество равно: 4
Максимальный и минимальный делитель
Для нахождения минимального и максимального делителя в код на Python нужно добавить две переменные: min_divider
и max_divider
. В цикле делитель будет сравниваться со значением этих переменных и, если необходимо, записываться в них.
Код программы:
numb = int(input("Введите целое число: ")) min_divider = numb max_divider = 1 for i in range(numb - 1, 1, -1): if (numb % i == 0): if (min_divider > i): min_divider = i if (max_divider < i): max_divider = i print("Минимальный равен:", min_divider) print("Максимальный равен:", max_divider)
Результат выполнения:
Введите целое число: 63 Минимальный равен: 3 Максимальный равен: 21
Нахождение наименьшего и наибольшего делителя, подсчёт суммы делителей и их количества можно объединить в одну программу на Python. Это не должно вызвать каких-либо проблем или конфликтов, потому что программа работает с 4 независимыми переменными.