在不合并公共值的情况下计算倍数之和

时间:2014-03-20 12:19:38

标签: javascript

通过将常用值组合成一个来生成以下代码:

//3,6,9,12,15------
//5,10,15----------

//result: sum of (3,5,6,9,10,12,15) = 60

int = 0;
for(var i=1;i<16;i++){
    if(i%3==0 || i%5==0){

        int +=i;
    }
}
alert(int);//60

但我想在不合并的情况下获得输出:

    //3,6,9,12,15------|should ressult:
    //5,10,15----------|75

//result without combining: sum of (3,6,9,12,15,5,10,15) == 75

如果你说我应该做&amp;&amp;而不是||那么它只会产生公共和,即15例。

那么,我该怎么办?

1 个答案:

答案 0 :(得分:5)

这样可以解决问题:

int = 0;
for(var i=1;i<16;i++){
    if(i%3==0){
        int +=i;
    }
    if(i%5==0){
        int +=i;
    }
}
alert(int);//75

或者如果您更喜欢更紧凑的解决方案:

int = 0;
for(var i=1;i<16;i++){
    int += (i % 3 ? 0 : i) + (i % 5 ? 0 : i);
}
alert(int);//75

基本上,对于15的倍数的值,你需要计算两次。


关于不使用循环的解决方案的提示:我们可以将问题解决为仅列出 a 之间的所有 n 的倍数和 b -1。这可以通过查看它产生的序列直接计算而不通过每个数字。对于 n = 3, a = 1, b = 28,这是:

  

3,6,9,12,15,18,21,24,27

现在请注意,27 + 3 = 30,24 + 6 = 30,21 + 9 = 30,18 + 12 = 30,并且中间只有一个异常值,15。所以你需要知道所有的顺序如果元素的数量是奇数,则解决这个问题是序列中的最小元素,最大元素,元素数量和中间元素。 (事实上​​,一旦你意识到它恰好是最小值和最大值之和的一半,你甚至不需要知道中间数。)

为了帮助你更多:

var max = Math.floor((b - 1) / n) * n;
var min = a + n - (a % n);
var count = (max - min) / n + 1;