如何在javascript中找到25的阶乘

如何在javascript中找到25的阶乘,javascript,Javascript,当我使用 function processData(input) {`console.log(fact(input));`} function fact(input) { if (input == 1 || input == 0) { return input; } else { return input * fact(input - 1); } } 我得到的输出是: 1.5511210043330986e+25 但我需要: 155112100433309859

当我使用

function processData(input) {`console.log(fact(input));`}

function fact(input) {
  if (input == 1 || input == 0) {
    return input;
  } else {
    return input * fact(input - 1);
  }
}
我得到的输出是:

1.5511210043330986e+25
但我需要:

15511210043330985984000000
我为这个输出做了什么。
我不能包含任何库,因为它是在线测试,我没有添加库的权限。

如果您想要这种输出,您需要使用一个与Javascript不同的库来处理数字。它叫BigNumber.js

您的代码如下所示:

function processData(input) { console.log(fact(input).toFormat().replace(/\,/g, "")); }
function fact(input) {
    if(typeof input != "object")
         input = new BigNumber(input);
    if(input.equals(1) || input.equals(0))
         return input;
    return input.times(fact(input.minus(1)))
}

在JavaScript中,数字的精度不足以表示25!的所有数字!,因此,只需计算
25*24*…*1
将产生不正确的结果

要处理大量数据,最好的方法是使用一个任意精度的整数库,比如,已经过全面测试的库。但即使你不能使用图书馆,你仍然可以计算25!通过将结果分成更小的块:

function factorial(n) {
    var x = [1, 0];     // Two chunks are enough to represent 25!
    var base = 1e18;    // Each chunk x[0] and x[1] stores a number from 0 to (base - 1).

    function pad(i) {   // Pad a chunk with 0's on the left to 18 digits.
        return (i + base).toString().substr(1);
    }

    function trim(s) {  // Remove all leading 0's from the string s.
        return s.match(/[1-9].*/)[0];
    }

    for (; n > 1; n--) {
        x[0] *= n;
        x[1] *= n;
        if (x[0] >= base) {
            var carry = Math.floor(x[0] / base);
            x[1] += carry;
            x[0] -= carry * base;
        }
    }

    return trim(x[1].toString() + pad(x[0]));
}

console.log(factorial(25)); // 15511210043330985984000000

请注意,此代码只计算25!。对于较大的n值,需要添加更多的块。

您可以使用
BigInt

console.log(BigInt(Array.from)(Array(25),(i,i)=>BigInt(i+1)).reduce((a,b)=>BigInt(a)*BigInt(b)).toString()您可以在如下递归函数中使用:

const factorialize=(num)=>{
如果(num==0n)返回1n;
返回num*factorialize(num-1n);
};

log(字符串(factorialize(BigInt(25)))您有正确的输出-
1.5511210043330986e+25
的值与
1551121004333098854000000
的值相同,但以科学符号格式显示。是的,但我需要1551121004333098854000000而不是1.5511210043330986e+25。需要一个库,因为使用的数字大于
number.MAX\u SAFE\u INTEGER
。使用时,我得到155112100433309800000000,但与实际输出不一样最优雅、最容易准备的解决方案目前为止好极了!