Сумма цифр большого факториала без использования 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 шт):
Число представим в виде массива цифр от младших разрядов к старшим. Умножение школьное в столбик (функция 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?