我刚开始在HackerRank上遇到了一些问题,现在又遇到了一个可用的项目Euler问题。
问题陈述说:找出n下面3或5的所有倍数之和
我通过求3的倍数之和+5的倍数之和-15的倍数之和小于cc>
function something(n) {
n = n-1;
let a = Math.trunc(n / 3);
let b = Math.trunc(n / 5);
let c = Math.trunc(n / 15);
return (3 * a * (a + 1) + 5 * b * (b + 1) - 15 * c * (c + 1)) / 2;
}
console.log(something(1000)); //change 1000 to any number
我尝试过使用
n
的值,它似乎工作得很好,但是对于五分之二的测试用例,它返回了错误的答案(我无法访问测试用例)。我的问题是我的代码有什么问题?至少在我看来逻辑是正确的。
编辑:Link to problem page
最佳答案
输入中的一些数字可能比javascript默认处理的数字要大。正如hackkerrank网站上的讨论所述,您需要一个额外的库(比如:bignumber.js)来实现这一点。
下面的信息和代码是由一个名叫john_manuel_men1的用户在讨论中发布的,在讨论中,其他一些人也遇到了与您相同或相似的问题
这就是我在javascript中发现的js似乎将结果存储为字符串。由于某些原因,使用.toNumber()方法改变了结果,因此我改用.toString()方法。
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());
answer();
}
function answer() {
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());
}
}