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