Для тех, кто не понял задачу, подробнее можно почитать здесь. Так же тут есть формулы для более оптимального поиска кол-ва делителей используя простые числа.
https://zaochnik.com/spravochnik/matematika/delimost/nahozhdenie-vseh-delitelej-chisla/
Ваша функция KolDel
работает не верно. Я переписала алгоритм, который работает верно, но он не оптимален. В качестве проверки можно использовать число 60 – имеет 12 делителей.
import math
def countDividers(n):
if n <= 0: return 0 # условно будем так считать
if n == 1: return 1
k = 2 # делителей изначально 2, само число и единица.
for i in range(2, round(math.sqrt(n)) + 1):
if n % i == 0:
k += 1 if i == n // i else 2 #считаем и делитель и частное, если они не совпадают
return k
def maxDividersCountAtRange(m , n):
if m > n : m, n = n, m # меняем местами если m > n, только для учебных програм
maxDivs = 0 #
numberWithMaxDivs = [] #список чисел с максимальным числом делителей
for i in range(m, n): #идем по интервалу
d = countDividers(i) #записываем результат в переменную для оптимизации
if d > maxDivs: #ищем максимум
maxDivs = d
numberWithMaxDivs = [] #очищаем список при изменении максимума
if d == maxDivs:
numberWithMaxDivs.append(i) #добавляем число в список
return maxDivs, numberWithMaxDivs
print(maxDividersCountAtRange(20,80))
Ввод и красивый вывод можно дописать самостоятельно
Питон знаю мало, так что правки приветствуются
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# Первые 500 простых чисел из википедии: nums = [ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71, 73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173, 179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281, 283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409, 419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541, 547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659, 661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809, 811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941, 947,953,967,971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,1069, 1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,1213,1217,1223, 1229,1231,1237,1249,1259,1277,1279,1283,1289,1291,1297,1301,1303,1307,1319,1321,1327,1361,1367,1373, 1381,1399,1409,1423,1427,1429,1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499,1511, 1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,1597,1601,1607,1609,1613,1619,1621,1627,1637,1657, 1663,1667,1669,1693,1697,1699,1709,1721,1723,1733,1741,1747,1753,1759,1777,1783,1787,1789,1801,1811, 1823,1831,1847,1861,1867,1871,1873,1877,1879,1889,1901,1907,1913,1931,1933,1949,1951,1973,1979,1987, 1993,1997,1999,2003,2011,2017,2027,2029,2039,2053,2063,2069,2081,2083,2087,2089,2099,2111,2113,2129, 2131,2137,2141,2143,2153,2161,2179,2203,2207,2213,2221,2237,2239,2243,2251,2267,2269,2273,2281,2287, 2293,2297,2309,2311,2333,2339,2341,2347,2351,2357,2371,2377,2381,2383,2389,2393,2399,2411,2417,2423, 2437,2441,2447,2459,2467,2473,2477,2503,2521,2531,2539,2543,2549,2551,2557,2579,2591,2593,2609,2617, 2621,2633,2647,2657,2659,2663,2671,2677,2683,2687,2689,2693,2699,2707,2711,2713,2719,2729,2731,2741, 2749,2753,2767,2777,2789,2791,2797,2801,2803,2819,2833,2837,2843,2851,2857,2861,2879,2887,2897,2903, 2909,2917,2927,2939,2953,2957,2963,2969,2971,2999,3001,3011,3019,3023,3037,3041,3049,3061,3067,3079, 3083,3089,3109,3119,3121,3137,3163,3167,3169,3181,3187,3191,3203,3209,3217,3221,3229,3251,3253,3257, 3259,3271,3299,3301,3307,3313,3319,3323,3329,3331,3343,3347,3359,3361,3371,3373,3389,3391,3407,3413, 3433,3449,3457,3461,3463,3467,3469,3491,3499,3511,3517,3527,3529,3533,3539,3541,3547,3557,3559,3571 ] def numberDiv(N): #count = 2 if N in nums: return 2 x = N L = [] for p in nums: if x < p: break countP = 0 while x % p == 0: countP += 1 x = x / p L.append(countP) if x in nums: L.append(1) #count += 1 break count = 1 for i in L: count *= i + 1 return count if __name__ == '__main__': A = int(input('Введите A не больше 3500: ')) B = int(input('Введите B не больше 3500: ')) maxDiv = 0 maxDivN = 0 for i in range(A, B + 1): n = numberDiv(i) print(i, ' => ', n) if n >= maxDiv: maxDiv = n maxDivN = i print('максимум делителей у ', maxDivN) |
Делитель — это число, на которое нацело делится делимое. У делимого может быть один или несколько делителей, найти их все можно с помощью простого алгоритма, который без проблем реализуется на 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 независимыми переменными.
У Вас M и N – какие числа? Вот как будет с натуральными числами и оптимизацией по нахождению количества делителей:
def deli(n):
l, m = 0, int(n**0.5)
for i in range(1, m + 1):
if n % i == 0: l += 2
if m * m == n: l -= 1
return l
while True:
M, N = map(int, input('M N: ').split())
maxi, num = 0, []
for i in range(M, N + 1):
d = deli(i)
if d > maxi: maxi = d; num = [i]
elif d == maxi: num.append(i)
print('Количество делителей:', d)
print(*num)
Как видно, выводятся всё числа диапазона [M;N], для которых количество делителей максимально. Количество делителей каждого натуральное числа i определяется так: в цикле по натуральным числам j от 1 до m=√i включительно проверяется делимость i на j, если i делится на j, то количество делителей увеличивается на 2, в конце цикла проверяется условие m²=i – если имеет место равенство, количество делителей уменьшается на 1. Сложность алгоритма ~ Σ(i=M;N)√i. Для диапазонов [M;N] шириной порядка миллионов и без того оптимизированную программу надо будет оптимизировать ещё больше, иначе будет всё медленно считаться, а безо всякой оптимизации, даже, например, такой простой как у меня, вообще всё начинает виснуть, причём ни при никаких ни при миллионах, а всего лишь при скольких-то там тысячах…
На чтение 6 мин Просмотров 2к. Опубликовано
При работе с числами в программировании зачастую бывает нужно найти количество делителей для данного числа. Например, при работе с задачами на поиск простых чисел или при вычислении наибольшего общего делителя. В этой статье мы рассмотрим несколько способов, как найти количество делителей числа в языке программирования 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).