ФакториаL9;л числа n (обозначается n!, произносится эн факториаL9;л) — произведение всех натуральных чисел до n включительно:
Для n = 6, n! = 6! = 1*2*3*4*5*6 = 720.
Казалось бы все просто, да нет. Число символов очень быстро растет и быстро выходит за пределы числа, в 1С длина числа 32 знака.
Конечно же, многие скажут надо работать с символами строки, но тогда получается очень медленно.
Есть компромисс, идея в следующем.
Разбивать строку при вычислении не по символам, а по блокам.
Так как максимальная длина числа 32. И допустим мы хотим найти факториал 999, тогда длина второго множителя может быть равна не более 32 – 3 = 29 знаков.
Результат храним в строке неограниченной длины.
Строку результата разбиваем на блоки максимальной длины, преобразуем к числу, умножаем на текущий параметр. И формируем новую строку.
Алгоритм можно использовать рекурсии (именно он и был использован):
F(x) = x * F(x-1), где F(1) = 1
Ускорение получается на порядок по сравнению с посимвольным расчетом.
Во вложении пример обработки.
Изменения: Проверка была выполнена на платформе 8.2.15.319 (на других результаты могут отличаться)
Опытным путем было обнаружено, что максимальная длина числа составляет 311 цифр. Решение: замена макс длины на 311.
Максимальная вложенность рекурсии 1776. Решение: замена рекурсии на цикл.
Функция число в строку и наоборот работает медленно, дольше всего остального. Решение: было заменено на ТаблицуЗначений где в каждой строке храниться число, а не строка.
Добавлена формула Стирлинга для вычисления порядка факториала. N! ~ sqrt(2 * PI * n) * (n/e)^n
Теперь 10000! расчитывается за 50 секунд = 2.8е35660.