Попытка найти сумму факториального числа с помощью big-int npm дает неправильный ответ - PullRequest
0 голосов
/ 25 мая 2020

Я решаю задачу Эйлера, где вам нужно найти сумму целых чисел факториала. так например 10! равно 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27. Я написал это, используя библиотеку big-int для работы с большими числами.

factorialize =(num)=> {
  if (num < 0) {
        return -1;
  }
  else if (num == 0) {
      return 1;
  }
  else {
      return (num * factorialize(num - 1));
  }
}


findFactorialSum=(x)=>{
  let total=0;
  let result = bigInt(factorialize(x));
  // let result=factorialize(x).toString().split("").map(el => parseInt(el));
  // result.split("");
  let converted = result.toString().split("").map(el => parseInt(el));
  console.log(converted);
  for(let i=0;i<=converted.length-1;i++)
{
  total=total+converted[i]
}  
  console.log(total);
  return total;
}

это работает для небольших факториалов и дает правильные ответы, но как только вы go для чего-то большего, чем 12, он дает неправильные ответы, например, для 100 я получаю 683, но ответ, согласно сайту, должен быть 648> <. Я предполагаю, что большая библиотека int, которую я использую, возвращает неправильное число, но она работала для меньших чисел, поэтому я не вижу, в чем может быть проблема. </p>

Ответы [ 2 ]

4 голосов
/ 25 мая 2020

Я предполагаю, что используемая вами библиотека BigInt принимает большое число как строку. Что-то вроде

bigint("23837458934509644434537504952635462348")

Вы делаете

let result = bigInt(factorialize(x));

Вызов factorialize(100) уже переполнился Javascript s MAX_SAFE_INTEGER и передает неправильную строку в вызов bigInt.

Вы также должны использовать BigInts для вычисления факториала.

0 голосов
/ 26 мая 2020

В дополнение к ответу Джерила, который является вашим curlpit, вы также можете использовать reduce для вычисления суммы массива. Демо:

const factorialize = (bigNum) => {
  if (bigNum.lt(0)) {
    return bigInt(-1);
  } else if (bigNum.eq(0)) {
    return bigInt(1);
  } else {
    return bigNum.times(factorialize(bigNum.minus(1)));
  }
};


const findFactorialSum = (x) => {
  const result = factorialize(bigInt(x)),
        total = result.toString().split('')
                      .reduce((sum, digit) => sum + +digit, 0);

  console.log(result.toString().split('').join('+') + ' = ' + total);
  return total;
};

findFactorialSum(10); // 27
findFactorialSum(15); // 45
findFactorialSum(20); // 54
<script src="https://peterolson.github.io/BigInteger.js/BigInteger.min.js"></script>
...