Javascript 欧拉计划29:为什么我的答案在37之前就被否决了?

Javascript 欧拉计划29:为什么我的答案在37之前就被否决了?,javascript,Javascript,我正在研究: ab为2生成的序列中有多少不同的项≤ A.≤ 100和2≤ B≤ 一百 我已经用过滤器完成了暴力解决方案: var main = function() { var arr = []; for (var a = 2; a <= 100; a++) { for (var b = 2; b <= 100; b++) { arr.push(BigInt(Math.pow(a, b))); } }

我正在研究:

ab为2生成的序列中有多少不同的项≤ A.≤ 100和2≤ B≤ 一百

我已经用过滤器完成了暴力解决方案:

var main = function() {

    var arr = [];

    for (var a = 2; a <= 100; a++) {
        for (var b = 2; b <= 100; b++) {
            arr.push(BigInt(Math.pow(a, b)));
        }
    }
    //arr.sort((a, b) => a - b);

    return arr.filter(function(elem, pos) {
        return arr.indexOf(elem) == pos;
    }).length;
}

console.log(main());
var main=function(){
var-arr=[];

对于(var a=2;a将数组转换为集合,将自动删除所有重复项。返回集合的大小

var main=function(){
var-arr=[];
对于(var a=2;a而言,问题在于

BigInt(Math.pow(a, b))
即使使用BigInt,其内部的表达式也会在传递给BigInt之前得到评估,Javascript无法精确处理大量的数据。这种行为看起来依赖于浏览器,不幸的是,这个问题在每个环境中都无法充分重现

对于跨浏览器解决方案,您必须找到另一种方法,例如查找每个数字的不同因子,并使用重复因子计数过滤掉数字。(例如,2^4的素因子为2x2x2,与4^2相同-过滤掉所有此类重复项。)

例如:

const isPrime=num=>{
for(设i=2;i1;
}
常量素数=Array.from(
{长度:100},
(u,i)=>i+1
).过滤器(iPrime);
常量addprimestobj=(num,prime,obj)=>{
而((num/prime)%1==0){
obj[prime]=(obj[prime]| | 0)+1;
num=num/素数;
}
返回num;
};
var main=函数(){
常量factorsSet=新集合();
对于(设a=2;a`${key}-${val}`)
.加入;
factorsSet.add(factorsStr);
}
}
返回系数set.size;
}
console.log(main());
BigInt具有足够的(任意)精度(chrome支持)

var main=function(){
var-arr=[];

对于(var a=2;a,它实际上关闭了37,
BigInt
的意义是什么?我没有足够的声誉来评论,但我只是在我的浏览器(Chrome版本74.0.3729.131)中运行了这段代码,它按预期执行,并给了我9183。你是在32位系统上吗?这毫无意义。你首先生成高功率(并失去精度)然后你才把结果转换成
BigInt
,在那里它不再重要了。好的,谢谢。你能描述一下你找到所有因子的意思吗?你的意思是3*4吗?哦,谢谢,是的,那是错误的,3^4的素数因子是3x3x3,因为我们是在求幂,而不是在乘法。把所有的数字都分成素数因子计数,然后过滤掉重复的因子计数。这个答案也是正确的。虽然我不知道为什么。你用p做的更改如何使BigInt比我做的更精确?@Jerome,因为你做了
Math.pow(a,b)
(精度较低)并将结果强制转换为BigInt。我首先将
a
强制转换为BigInt,然后通过将
p
中的BigInt数相乘来计算幂(并保存精度)。@Jerome解决方案可能更快(时间复杂度更低)且更便携(不使用BigInt)因为他不计算幂,而是做素因式分解,检查幂——检查他的答案是否被接受