通过将常用值组合成一个来生成以下代码:
//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例。
那么,我该怎么办?
答案 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;