HackerRank上JavaScript中的Euler#1项目

HackerRank上JavaScript中的Euler#1项目,javascript,functional-programming,precision,Javascript,Functional Programming,Precision,我在HackerRank上的Euler#1项目的测试用例中遇到了一些问题,我希望在HackerRank上有JS经验的人能够提供帮助 下面是我的代码。据我所知,我无法发现任何明显的逻辑错误,因此如果有人能解释为什么我没有通过所有测试用例,以及为什么状态为“abort called”,我将不胜感激。“忽略此行上方”上面的所有代码均由HackerRank提供,不属于解决方案的一部分 process.stdin.resume(); process.stdin.setEncoding('ascii');

我在HackerRank上的Euler#1项目的测试用例中遇到了一些问题,我希望在HackerRank上有JS经验的人能够提供帮助

下面是我的代码。据我所知,我无法发现任何明显的逻辑错误,因此如果有人能解释为什么我没有通过所有测试用例,以及为什么状态为“abort called”,我将不胜感激。“忽略此行上方”上面的所有代码均由HackerRank提供,不属于解决方案的一部分

process.stdin.resume();
process.stdin.setEncoding('ascii');

var input_stdin = "";
var input_stdin_array = "";
var input_currentline = 0;

process.stdin.on('data', function (data) {
    input_stdin += data;
});

process.stdin.on('end', function () {
    input_stdin_array = input_stdin.split("\n");
    main();    
});

function readLine() {
    return input_stdin_array[input_currentline++];
}

/////////////// ignore above this line ////////////////////

function threeFiveMultiples(num) {
    let array = [];
    for (let i = 0; i < num; i++) {
        if (i % 3 === 0 ||
            i % 5 === 0) {
            array.push(i);
        }    
    }
    return array.reduce(function(accum, currVal) {
        return accum + currVal;
    });
}

function main() {
    var t = parseInt(readLine());
    for(var a0 = 0; a0 < t; a0++){
        var n = parseInt(readLine());
        let res = threeFiveMultiples(n);
        console.log(res);
    }
}

你的代码很好。如果您只需调用console.log(35倍(1000));,它将为您提供解决方案。不确定其他所有代码都是关于什么的,但这会起作用。

您的代码很好。如果您只需调用console.log(35倍(1000));,它将为您提供解决方案。不确定所有其他代码是关于什么的,但这会起作用。

尝试对值使用
Math.round()
(求和后),JavaScript将所有数字视为双倍数字,因此有些数字可能无法正确显示

如果大数字是个问题,试着找一个你可以使用的可以处理大数字的库。如果不能,您可以通过字符串自己实现它们,考虑到您只需要求和就不会那么困难了

更新:

我认为返回可能是问题所在(您使用的是
parseInt
,它可能将BigNumber转换为字符串,然后尝试将其解析为数字),请尝试执行以下操作:

return array.reduce(function(accum, currVal) {
    return accum.plus(currVal);
}, new BigNumber(0)).toString();

尝试对值使用
Math.round()
(求和后),JavaScript将所有数字视为双倍数字,因此某些数字可能无法正确显示

如果大数字是个问题,试着找一个你可以使用的可以处理大数字的库。如果不能,您可以通过字符串自己实现它们,考虑到您只需要求和就不会那么困难了

更新:

我认为返回可能是问题所在(您使用的是
parseInt
,它可能将BigNumber转换为字符串,然后尝试将其解析为数字),请尝试执行以下操作:

return array.reduce(function(accum, currVal) {
    return accum.plus(currVal);
}, new BigNumber(0)).toString();

问题是,对于非常大的数字,计算会占用相当多的时间,hackerrank的计算超时时间为
10s
。您必须找到一种更快的方法来计算正确的输出


一个小提示:算术级数(可能在
O(1)
中)

问题是,对于非常大的数字,计算会占用相当多的时间,hackerrank的计算超时时间为
10s
。您必须找到一种更快的方法来计算正确的输出


一个小提示:算术级数(可能在
O(1)
中)

代码失败的原因有两个

1)超时错误 您编写的代码逻辑迭代每个数字,并检查它是否可被3或5整除。当testcase中的数字为巨大数字时,此逻辑会导致超时错误

2)编号不能在JS中表示 测试用例3和测试用例2中使用的数字很大。因此,使用像“bignumber.js”这样的库是必要的,因为js不支持长整数

下面是有助于通过所有测试用例的代码片段:

process.stdin.resume();
process.stdin.setEncoding('ascii');

var input_stdin = "";
var input_stdin_array = "";
var input_currentline = 0;

process.stdin.on('data', function (data) {
    input_stdin += data;
});

process.stdin.on('end', function () {
    input_stdin_array = input_stdin.split("\n");
    main();    
});

function readLine() {
    return input_stdin_array[input_currentline++];
}

/////////////// ignore above this line ////////////////////

function main() {
    var BigNumber = require('bignumber.js');
    var t = new BigNumber(readLine()).toNumber();
    var n;
    for (var a0 = 0; a0 < t; a0++) {
        n = new BigNumber(readLine());
        sumOfNumberDivisibleBy3and5(n);
    }   
}
function sumOfNumberDivisibleBy3and5(n) {
    const a = n.minus(1).dividedBy(3).floor();
    const b = n.minus(1).dividedBy(5).floor();
    const c = n.minus(1).dividedBy(15).floor();
    const sumThree = a.times(3).times(a.plus(1)).dividedBy(2);
    const sumFive = b.times(5).times(b.plus(1)).dividedBy(2);
    const sumFifteen = c.times(15).times(c.plus(1)).dividedBy(2);
    const sumOfAll = sumThree.plus(sumFive).minus(sumFifteen);
    console.log(sumOfAll.toString());
}




process.stdin.resume();
process.stdin.setEncoding('ascii');
var输入_stdin=“”;
var输入_stdin_array=“”;
var输入_currentline=0;
process.stdin.on('data',函数(data){
输入_stdin+=数据;
});
process.stdin.on('end',function(){
input_stdin_数组=input_stdin.split(“\n”);
main();
});
函数readLine(){
返回input_stdin_数组[input_currentline++];
}
///////////////忽略这条线以上的内容////////////////////
函数main(){
var BigNumber=require('BigNumber.js');
var t=新的BigNumber(readLine()).toNumber();
var n;
对于(var a0=0;a0
您的代码失败可能有两个原因

1)超时错误 您编写的代码逻辑迭代每个数字,并检查它是否可被3或5整除。当testcase中的数字为巨大数字时,此逻辑会导致超时错误

2)编号不能在JS中表示 测试用例3和测试用例2中使用的数字很大。因此,使用像“bignumber.js”这样的库是必要的,因为js不支持长整数

下面是有助于通过所有测试用例的代码片段:

process.stdin.resume();
process.stdin.setEncoding('ascii');

var input_stdin = "";
var input_stdin_array = "";
var input_currentline = 0;

process.stdin.on('data', function (data) {
    input_stdin += data;
});

process.stdin.on('end', function () {
    input_stdin_array = input_stdin.split("\n");
    main();    
});

function readLine() {
    return input_stdin_array[input_currentline++];
}

/////////////// ignore above this line ////////////////////

function main() {
    var BigNumber = require('bignumber.js');
    var t = new BigNumber(readLine()).toNumber();
    var n;
    for (var a0 = 0; a0 < t; a0++) {
        n = new BigNumber(readLine());
        sumOfNumberDivisibleBy3and5(n);
    }   
}
function sumOfNumberDivisibleBy3and5(n) {
    const a = n.minus(1).dividedBy(3).floor();
    const b = n.minus(1).dividedBy(5).floor();
    const c = n.minus(1).dividedBy(15).floor();
    const sumThree = a.times(3).times(a.plus(1)).dividedBy(2);
    const sumFive = b.times(5).times(b.plus(1)).dividedBy(2);
    const sumFifteen = c.times(15).times(c.plus(1)).dividedBy(2);
    const sumOfAll = sumThree.plus(sumFive).minus(sumFifteen);
    console.log(sumOfAll.toString());
}




process.stdin.resume();
process.stdin.setEncoding('ascii');
var输入_stdin=“”;
var输入_stdin_array=“”;
var输入_currentline=0;
process.stdin.on('data',函数(data){
输入_stdin+=数据;
});
process.stdin.on('end',function(){
input_stdin_数组=input_stdin.split(“\n”);
main();
});
函数readLine(){
返回input_stdin_数组[input_currentline++];
}
///////////////忽略这条线以上的内容////////////////////
函数main(){
var BigNumber=require('BigNumber.js');
var t=新的BigNumber(readLine()).toNumber();
var n;
对于(var a0=0;a0