2015-06-29 33 views
2
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中找到數字序列的總和

我怎樣才能找到這個序列的總和?

+0

我在下面添加了一個恆定時間的解決方案,您可能會對此感興趣。您可能會學習一些很酷,新的(但很簡單!)數學。 – royhowie

回答

4

看評論在線:

DEMO

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

+0

它可以在沒有循環的情況下完成,即在恆定的時間內完成。 – royhowie

+0

@royhowie我不認爲它可以沒有循環,但是你可以使用'filter' – Tushar

+0

這是兩個算術序列;你可以確定地在不變的時間內找到總和。 – royhowie

2

一個循環是好的,所有的,但這個問題其實只是數學。 我們可以做得更好,並在恆定時間內找到總和。

算術序列是術語之間的差異是恆定的。例如,

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

是算術序列,其中d,術語之間的差別,是1

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

d 2.

如果我們取一個的算術序列看看我們的序列:

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

我們可以曲ickly看到我們有兩個重疊的等差數列(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 
0
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

相關問題