如何在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,但与实际输出不一样最优雅、最容易准备的解决方案目前为止好极了!