Это скорее математический ответ, чем программный, но один из способов улучшить ваш алгоритм - это подумать о том, как определить количество делителей числа.
Метод грубой силы заключался бы в переборе всех чисел, меньших, чем ваш тестовый номер, и проверке каждого из них, но, как вы выяснили, это не очень эффективно для больших чисел.
Более эффективным способом было бы рассмотреть разложение на простые числа вашего тестового числа. Любое целое число можно записать как произведение простых чисел. Предположим, что N имеет простые множители p1
, p2
, ..., pn
с показателями k1
, k2
, ..., kn
, т.е. N == p1**k1 * p2**k2 * ... * pn**kn
, тогда количество делителей N
равно (k1+1)*(k2+1)*...*(kn+1)
. Таким образом, нахождение числа делителей эквивалентно нахождению простых множителей числа, что значительно ограничивает количество целых чисел, которые необходимо проверить.
Еще одна вещь, которую следует понять, это то, что если целые числа N1
и N2
не имеют общих простых множителей (что имеет место для N
и N+1
), количество делителей N1*N2
равно количеству делителей N1
, умноженному на количество делителей N2
. Это означает, что, поскольку вы рассматриваете числа в форме N*(N+1)//2
и поскольку N
и N+1
не имеют общих простых множителей, количество делителей ваших трех angular чисел равно произведению количества делители N//2
и количество делителей N+1
для четных N
, а также произведения количества делителей N
и количества делителей (N+1)//2
для нечетных N
.