for (var x = 0; x < 10; x++) {
if (x % 3 === 0 || x % 5 === 0) {
console.log(x)
}
}
这打印出来:0,3,5,6,9。我希望有一个输出 - 总和,或23 - 并用console.log
打印一次,而不是单独打印每个术语。 / p>
如何找到此序列的总和?
答案 0 :(得分:4)
见内联评论:
var sum = 0; // initialize to zero
for (var x = 0; x < 10; x++) {
if (x % 3 === 0 || x % 5 === 0) {
sum += x; // Add x to sum
}
}
document.write(sum); // Print sum
&#13;
答案 1 :(得分:2)
循环很好,但是这个问题实际上只是数学。 我们可以做得更好,并在恒定时间内找到总和。
算术序列是指术语之间的差异是不变的。例如,
1, 2, 3, 4, 5...
是一个算术序列,d
,术语之间的差异是1。
0, 2, 4, 6, 8...
是d
为2的算术序列。
如果我们看看我们的序列:
0, 3, 5, 6, 9...
我们可以很快发现我们有两个重叠的算术序列(3n
和5n
):
0, 5, 10, 15... and 0, 3, 6, 9, 12, 15...
然后我们可以很快看到共享条款是那些 15的倍数。
查找总和比看起来容易。我们可以使用那种方法 卡尔·弗里德里希·高斯(Karl Friedrich Gauss),有史以来最伟大的数学家之一,直觉 (但没有发现)在很小的时候(iirc,6岁)。
让我们再看一下我们的3n
序列:
0, 3, 6, 9, 12, 15...
你看到一个模式吗?如果我们画对,从每一端拿一个数字......
0 and 15
3 and 12
6 and 9
我们最终得到的是15的总和。从这里,我们可以找到一个公式。
有多少对? n / 2
,其中n
是术语数。
每对的总和是多少? a1 + aN
,其中a1
是第一个词
而aN
是最后一个。
这意味着我们的总和是
S = (n / 2) * (a1 + aN)
我们几乎就在那里。如果我们将两个序列的总和相加, 我们会多收一点钱。为什么呢?
0, 3, 6, 9, 12, 15...
0, 5, 10, 15...
我们计算两次15的倍数!但这很容易解释:
grandTotal = sum3 + sum5 - sum15
我们的解决方案(您可能对arithmeticProgression
更感兴趣):
/*
finds the sum of two arithmetic sequences, on [min, max] (inclusive)
for two numbers a and b
*/
function getSum (min, max, a, b) {
function arithmeticProgression (start, stop, m) {
// find the nearest multiple of m greater than or equal to the starting bound
start = m * Math.ceil(start / m)
// find the nearest multiple of m less than or equal to the ending bound
stop = m * Math.floor(stop / m)
// the number of terms, e.g., in 0, 2, 4, 6, 8
// we have 5 terms because of (max - min)/delta + 1
// or, ((8 - 0) / 2) + 1 = 4 + 1 = 5
var terms = ((stop - start) / m) + 1
// our formula from before
return (terms / 2) * (start + stop)
}
var sum3 = arithmeticProgression(min, max, a)
var sum5 = arithmeticProgression(min, max, b)
var sum15 = arithmeticProgression(min, max, a * b)
return sum3 + sum5 - sum15
}
<强>试验:强>
console.log(getSum(0, 9, 3, 5) === 23) // true
答案 2 :(得分:1)
function sequenceSum(begin, end, step){
var sum = 0;
for (var x = begin; x <= end; x = x + step){
sum = sum + x;
}return sum;
};
样品测试:sequenceSum(1,5,1)===&gt; 15 // 1 + 2 + 3 + 4 + 5