Сумма цифр большого факториала без использования BigInt JS

/* Cумма цифр в числе 10! равна 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.

Найдите сумму цифр в числе N! (N < 1000) Определите функцию sumOfFact(n), которая получает n и возвращает искомую сумму. Поскольку большие числа не могут быть представлены в JS точно, разряды большого целого числа сохраняйте в массиве. Не использовать BigInt. */

const factorial = n => n ? n * factorial(n - 1) : 1;


function sumOfFact(n) {
 let num = String(factorial(n))
 if(n >= 22) {
 return num.split('').map(function(e){return parseInt(e)}).reduce(function(a,b){return a+b});
 } else {
     
 }
}

Код считает вплоть до n <= 22, подскажите, что сделать дальше


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Число представим в виде массива цифр от младших разрядов к старшим. Умножение школьное в столбик (функция scale). Факториал он и в Африке факториал. В конце суммируем цифры. Решение не самое быстрое (сложность N^2), но простое.

const scale = (n, f) => {
    let carry = 0;
    let j = 0;
    while (carry > 0 || j < n.length) {
        const p = carry + ((j < n.length) ? f * n[j] : 0);
        n[j] = p % 10;
        carry = Math.floor(p / 10); 
        j += 1;
    }
};

const factorial = n => {
    const f = [1];
    for (let i = 2; i <= n; ++i) {
        scale(f, i);
    }
    return f;
};

const sumOfFact = n => factorial(n).reduce((a, b) => a + b);

P.S. Подумайте что будет если константу 10 в scale заменить на 100?

→ Ссылка