2015-08-22 24 views
1

添加100和4000000之間的所有數值,包含3或5,但不能同時爲3和5可分爲添加100和4000000之間的所有數值,包含3或5,但不能同時爲3和5

無法弄清楚如何執行該規定的第二部分。這是我到目前爲止有:

var sum = 0; 
for (var i = 100; i < 4000001; i++) { 
    if (i % 3 || i % 5 === 0) { 
     sum = sum + i; 
    } 
} 
+0

這是什麼語言?什麼表達'我%3 ||我%5 === 0'是什麼意思?它看起來有點懷疑我。無論如何,假設你有'A || B'的權利,你真正需要的是「異或」或「XOR」:'A &&!B || !A && B'。 – Dialecticus

+0

我錯了。應該是i%3 === 0 –

回答

2

您只需逃脫只有那些涉及15師等較高的數字(15多個)的一部分,將進一步自動避免。

請注意,檢查15的可分性應該在頂部,這是真實的將繼續進一步迭代,而不執行3和5下面的整除代碼。如果爲假,那麼一個數字只能被3或5整除或者沒有,但不是兩者。

for (var i = 100; i < 4000001; i++) { 
    if(i % 15 == 0) 
    continue; 
    if (i % 3 == 0) { 
    sum = sum + i; 
    } 
    if (i % 5 == 0) { 
    sum = sum + i; 
    } 
} 

而且,請注意,必須使用===運營商,我不認爲這是一個有效的操作,也許你想==。順便說一句,我不知道是否有任何語言支持===,我認爲JavaScript支持。所以,在這一步要小心。

0
var sum = 0; 
for (var i = 100; i < 4000001; i++) { 
    if (i % 3 === 0^i % 5 === 0) { 
     sum = sum + i; 
    } 
} 

使用異或,XOR ^只有當其中一個條件不是兩者都爲真時才返回true。

+0

運算符'^'通常表示二進制異或,而不是邏輯異或,不應與其他邏輯運算符混合使用。我不知道'==='是什麼運算符,所以要小心潛在的錯誤和未定義的行爲。 – Dialecticus

+0

Dialecticus ^表示獨佔OR,它是邏輯獨佔而不是二進制獨佔,或者,在Javascript中===也檢查類型和值等值。只有當i%3爲0或i%5等於零時纔會通過。如果它未定義,它將不會 –

+0

'^'表示邏輯XOR的語言是什麼?在所有類C語言(C,C++,C#,Java,JavaScript)中,它是按位(二進制)XOR。我提到了未定義的行爲,因爲'^'是按位XOR,'==='可能不會返回按位結果。 – Dialecticus

6

可以計算總和沒有任何循環,用公式爲sum of an arithmetic progression:我們有

3 + 5 + 6 + 9 + 10 + 12 + 18 + 20 + ... 
= 3 + 6 + 9 + 12 + 15 + 18 + ... 
    + 5 + 10 + 15 + 20 + ... 
    - 2*(15 + 30 + 45 + ...) 

注意,我們添加的3和5所有的倍數,但然後減去15倍數的兩倍,因爲它們被計數兩次,作爲3和5的倍數。

設g(n)是從1到n的整數之和。我們有g(n) = n*(n+1)/2。假設f(n)是1和n之間可以被3或5整除的整數之和,但不能同時爲兩個整數之和。然後我們有

f(n) = 3*g(floor(n/3)) + 5*g(floor(n/5)) - 30*g(floor(n/15)) 

m和n由3或5整除的整數的總和,但不能同時是那麼只是f(n) - f(m - 1)。這可以在O(1)中計算。

+0

(+1),但我投票結束這個問題和答案,因爲這整個事情是關於數學而不是編程,並且屬於另一個stackexchange站點。開玩笑。 –

1

您可以使用!=而不是||,因爲這正是您想要的。只能被3或5整除,但不能同時被兩者整除。

var sum = 0; 
for (var i = 100; i < 4000001; i++) { 
    if ((i % 3 == 0) != (i % 5 == 0)) { 
     sum = sum + i; 
    } 
}