我刚开始在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());
    }
}

10-06 08:56