Python
Как с помощью программы вычислить количество делителей числа?
Число очень большое (10**15), поэтому перебор не подойдет
Вообще-то перебор подойдёт:
def cnt(n):
~~res, i = 0, 1
~~while i * i < n:
~~~~if n % i == 0: res += 2
~~~~i += 1
~~if i * i == n: res += 1
~~return res
И при n = 10 ** 15 будет проверено менее 32000000 делителей.
Существенно более быстрый для составных чисел вариант, построенный на подсчёте кол-ва вхождений в число каждого из простых делителей:
def cnt(n):
~~t, i, res = [], 2, 1
~~while i * i <= n:
~~~~c = 0
~~~~while n % i == 0:
~~~~~~c += 1
~~~~~~n //= i
~~~~if c: t.append(c)
~~~~i += 1
~~if n != 1: t.append(1)
~~for v in t: res *= v + 1
~~return res
def cnt(n):
~~res, i = 0, 1
~~while i * i < n:
~~~~if n % i == 0: res += 2
~~~~i += 1
~~if i * i == n: res += 1
~~return res
И при n = 10 ** 15 будет проверено менее 32000000 делителей.
Существенно более быстрый для составных чисел вариант, построенный на подсчёте кол-ва вхождений в число каждого из простых делителей:
def cnt(n):
~~t, i, res = [], 2, 1
~~while i * i <= n:
~~~~c = 0
~~~~while n % i == 0:
~~~~~~c += 1
~~~~~~n //= i
~~~~if c: t.append(c)
~~~~i += 1
~~if n != 1: t.append(1)
~~for v in t: res *= v + 1
~~return res
Самый большой возможный делитель числа - его квадратный корень. Поэтому перебрать нужно до 10 ** 7.5, перебор - вполне подойдет. Если по-умному перебирать, итераций будет еще меньше) Например если сразу поделить число на 2 и 3, пока делится. Затем перебрать range(5, 10 ** 7.5, 6) и range(7, 10 ** 7.5, 6)... пойдет 11, 17, 23... 13, 19, 25, 31...
(◔‿◔) Вот так вот быстро находится количество делителей для квадриллиона, включая единицу и сам квадриллион - их получается 256. А это как раз метод перебора и есть, в котором нет ничего лишнего, особенно дурацкого цикла while i*i<n с лишними десятками миллионов умножений при n=10¹⁵ !.
import math
def quantity(n):
m = math.ceil(math.sqrt(n))
if m * m == n: k = 1
else: k = 0
for i in range(1, m):
if n % i == 0: k += 2
return k
while True: print(quantity(int(input('n = ?\b'))))
Ещё быстрее общее количество делителей можно найти методом факторизации, основанном на основной теореме арифметики, однако в этом методе в данном случае нет никакой нужды, с ним наоборот всё намного замедлится! Другое дело, если написàть небольшой акселератор, скажем, на языке C++ для генерации битового поля с информацией о простоте нескольких миллиардов первых натуральных чисел и для работы с ними. Вот тогда в случае множественной оценки всё будет действительно просто замечательно даже и для двадцатизначных чисел, а не то что там для каких-то мелких триллионов и квадриллионов, только это ведь уже́ не чистый Python, а смесь языков.. ʘ‿ʘ
import math
def quantity(n):
m = math.ceil(math.sqrt(n))
if m * m == n: k = 1
else: k = 0
for i in range(1, m):
if n % i == 0: k += 2
return k
while True: print(quantity(int(input('n = ?\b'))))
Ещё быстрее общее количество делителей можно найти методом факторизации, основанном на основной теореме арифметики, однако в этом методе в данном случае нет никакой нужды, с ним наоборот всё намного замедлится! Другое дело, если написàть небольшой акселератор, скажем, на языке C++ для генерации битового поля с информацией о простоте нескольких миллиардов первых натуральных чисел и для работы с ними. Вот тогда в случае множественной оценки всё будет действительно просто замечательно даже и для двадцатизначных чисел, а не то что там для каких-то мелких триллионов и квадриллионов, только это ведь уже́ не чистый Python, а смесь языков.. ʘ‿ʘ
В маткаде есть
Похожие вопросы
- Как среди чисел, данных в блокноте, найти, те у которых определенное количество делителей(в Python)
- Питон. Как найти все делители числа?
- Программа на Python, Простые Числа
- Найдите количество пятизначных чисел, взаимно простых с числом 92.
- 1) Напишите программу, которая будет принимать числа от пользователя и суммировать их, пока он не напишет слово «sum».
- Простые числа.Напишите программу
- Выразите число в виде суммы четырех квадратов Нужно написать программу на python
- Питон. Ошибка в программе. Вычисление простых чисел
- Помогите написать программу которая посчитает количество строк в отзыве
- Олимпиада задача про делители и числа