如何在JavaScript中查找数字序列的总和

时间:2015-06-29 04:22:40

标签: javascript

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>

如何找到此序列的总和?

3 个答案:

答案 0 :(得分:4)

见内联评论:

DEMO

&#13;
&#13;
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;
&#13;
&#13;

答案 1 :(得分:2)

循环很好,但是这个问题实际上只是数学。 我们可以做得更好,并在恒定时间内找到总和。

算术序列是指术语之间的差异是不变的。例如,

1, 2, 3, 4, 5...

是一个算术序列,d,术语之间的差异是1。

0, 2, 4, 6, 8...

d为2的算术序列。

如果我们看看我们的序列:

0, 3, 5, 6, 9...

我们可以很快发现我们有两个重叠的算术序列(3n5n):

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