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
Вячеслав Гофман
Вячеслав Гофман
81 639
Лучший ответ
Самый большой возможный делитель числа - его квадратный корень. Поэтому перебрать нужно до 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, а смесь языков.. ʘ‿ʘ
В маткаде есть