Javascript 返回2作为素数因子的奇数

Javascript 返回2作为素数因子的奇数,javascript,recursion,numbers,Javascript,Recursion,Numbers,此函数接受一个数字并将其素数因子作为数组返回。我运行了一系列测试用例,结果都是正确的,除了这个数字900000400000001 代码根本没有经过优化,所以大多数这么大的数字都会超时。然而,这一个测试用例出于某种原因进行了计算,它给出了因子[2,2,2,2,2,2,2,2,2,2,5,5,5,5,5,5,5,89,241,1049],这显然是无稽之谈,因为9000004000000001是一个奇数 将这些因子相乘时,得到的数字为90000040000000001低于原始数字 这很奇怪,所以我尝试

此函数接受一个数字并将其素数因子作为数组返回。我运行了一系列测试用例,结果都是正确的,除了这个数字
900000400000001

代码根本没有经过优化,所以大多数这么大的数字都会超时。然而,这一个测试用例出于某种原因进行了计算,它给出了因子
[2,2,2,2,2,2,2,2,2,2,5,5,5,5,5,5,5,89,241,1049]
,这显然是无稽之谈,因为
9000004000000001
是一个奇数

将这些因子相乘时,得到的数字为
9000004000000000
<代码>1低于原始数字

这很奇怪,所以我尝试了
900000400000001%2
,它返回
0

我开始认为我的函数可能不是这里的问题,而是javascript中的模数或数字。为什么偶数可以被2整除

我将一些测试用例作为控制台日志与代码片段放在一起,以便您可以看到结果

谢谢

//假设它工作,则将整数分解为其素数分量,并将其作为数组返回
函数分解(num){
num=数学地板(num);
//存储所有因子的数组
让因子=[];
//从2开始遍历所有数字
//找到某个因子时中断
//如果num是prime(它自己的因子),也将中断
设i=2;
while(true){
如果(数量%i==0){
推动因素(i);
打破
}
我++
}
//i是while循环中的因子
//如果num不是素数,则递归分解i之后的余数
如果(i!==num){
factors=factors.concat(factorize(num/i));
}
回报因素;
}
console.log(factorize(16))//[2, 2, 2, 2]
console.log(factorize(101))//[101]
console.log(factorize(100001))//[11, 9091]
console.log(factorize(141))//[3, 47]
console.log(factorize(900000400000001))//[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 89, 241, 1049]

log(因式分解(900000400000001).reduce((a,b)=>a*b))//9000004000000000
您的数字大于可以准确存储在Javascript数字值中的最大整数,该值为
number.MAX_SAFE_integer
,值为9007199254740991,即(2^53)-1

以2的幂表示,您的数字大约等于2^56.32077,因此它有3.32个太多的“位”无法准确表示,这意味着该范围内的任何值都将在±10范围内出现误差

这是双精度浮点格式的一个限制

因此,不可能对其执行精确的整数运算

为了好玩,请在JS控制台中尝试以下操作:

> console.log(90000004000000001 + 1)
90000004000000000

> console.log(90000004000000001 + 9)
90000004000000020

我不理解这个网站上的负面情绪。这个问题很难说是问题的翻版,它应该是问题的翻版。这个问题解释了这个问题,但作为一名新程序员,这并不是显而易见的。我提供了测试用例、带有良好注释的代码,并清楚地说明了问题。为什么要否决投票?