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
一次,而不是單獨打印每個術語。如何在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
一次,而不是單獨打印每個術語。如何在JavaScript中找到數字序列的總和
我怎樣才能找到這個序列的總和?
看評論在線:
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
一個循環是好的,所有的,但這個問題其實只是數學。 我們可以做得更好,並在恆定時間內找到總和。
算術序列是術語之間的差異是恆定的。例如,
1, 2, 3, 4, 5...
是算術序列,其中d
,術語之間的差別,是1
0, 2, 4, 6, 8...
與d
2.
如果我們取一個的算術序列看看我們的序列:
0, 3, 5, 6, 9...
我們可以曲ickly看到我們有兩個重疊的等差數列(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
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)===> 15 // 1 + 2 + 3 + 4 + 5
我在下面添加了一個恆定時間的解決方案,您可能會對此感興趣。您可能會學習一些很酷,新的(但很簡單!)數學。 – royhowie