Первое, что нужно заметить, это то, что достаточно найти все основные факторы. Как только у вас есть это, легко найти количество полных делителей: для каждого числа прибавьте 1 к числу раз, когда оно появится, и умножьте их вместе. Таким образом, для 12 = 2 * 2 * 3 у вас есть (2 + 1) * (1 + 1) = 3 * 2 = 6 факторов.
Следующее следует из первого: когда вы находите фактор, разделите его так, чтобы полученное число было меньше. Когда вы комбинируете это с тем фактом, что вам нужно только проверить квадратный корень текущего числа, это огромное улучшение. Например, рассмотрим N = 10714293844487412. Наивно это займет N шагов. Проверка до квадратного корня занимает sqrt (N) или около 100 миллионов шагов. Но поскольку факторы 2, 2, 3 и 953 обнаружены на ранней стадии, вам на самом деле нужно всего лишь проверить один миллион - 100-кратное улучшение!
Еще одно улучшение: вам не нужно проверять каждое число, чтобы узнать, делит ли он ваш номер, просто простые числа. Если это более удобно, вы можете использовать 2 и нечетные числа, или 2, 3, и числа 6n-1 и 6n + 1 (базовое колесо).
Вот еще одно приятное улучшение. Если вы можете быстро определить, является ли число простым, вы можете уменьшить необходимость разделения еще больше. Предположим, что после удаления небольших факторов у вас есть 120528291333090808192969. Даже проверка до квадратного корня займет много времени - 300 миллиардов шагов. Но тест Миллера-Рабина (очень быстрый - может быть, от 10 до 20 наносекунд) покажет, что это число является составным. Как это помогает? Это означает, что если вы проверите свой корень куба и не найдете никаких факторов, тогда останется ровно два простых числа. Если число является квадратом, его коэффициенты являются первичными; если число не является квадратом, цифры являются различными штрихами. Это означает, что вы можете умножить свое «общее количество» на 3 или 4, соответственно, чтобы получить окончательный ответ - даже не зная факторов! Это может иметь большее значение, чем вы предполагали: количество необходимых шагов уменьшается с 300 до 50 миллионов, в 6000 раз больше!
Единственная проблема с вышеизложенным заключается в том, что Миллер-Рабин может доказать только то, что числа являются составными; если ему задано простое, оно не может доказать, что число является простым. В этом случае вы, возможно, захотите написать функцию проверки прочности, чтобы избавить себя от необходимости умножать на квадратный корень из числа. (Альтернативно, вы могли бы просто сделать еще несколько тестов Миллера-Рабина, если бы вы были удовлетворены высокой уверенностью в том, что ваш ответ правильный, а не доказательство того, что это так. Если число проходит 15 тестов, то оно составлено с вероятностью менее 1 . на миллиард)
Лучшим именем метода будет 'GetFactorCount'. – SLaks
Возможный дубликат http://stackoverflow.com/questions/110344/algorithm-to-calculate-the-number-of-divisors-of-a-given-number – empi