如何在javascript

时间:2015-08-15 19:33:39

标签: 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

但我需要: 1551121004333098的 59.84亿

我为此输出做了什么。 我无法包含任何库,因为它是在线测试,我无权添加库。

4 个答案:

答案 0 :(得分:4)

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

要处理大数字,最好的方法是使用经过全面测试的任意精度整数库,如BigInteger.js。但即使你不能使用图书馆,你仍然可以计算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值,需要添加更多的块。

答案 1 :(得分:3)

如果你想要那种输出,你需要使用一个处理数字的库而不是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)))
}

答案 2 :(得分:2)

您可以使用BigInt

console.log(BigInt(Array.from(Array(25),(_,i)=>BigInt(i+1)).reduce((a,b)=>BigInt(a)*BigInt(b))).toString());

答案 3 :(得分:1)

您可以在类似的递归函数中使用BigInt

 const factorialize = (num) => {
   if (num === 0n) return 1n;
   return num * factorialize(num - 1n);
 };
 console.log(String(factorialize(BigInt(25))));