2017-02-15 58 views
0

我對整個PHP業務非常陌生,並且試圖在ProjectEuler.com上完成第一項挑戰。簡單的問題:1000以下的數字可以被3和/或5整除嗎?將這些數字加在一起。添加每個數字低於20,可被3和5整除

因爲我的代碼開始噴涌出的數字令人難以置信的長串的,我只是堅持到20現在。

這是我使用的代碼:

<?php 
for ($test = 1; $test <= 20; $test++) { 

    $total = 0; 

    if (($test % 3 == 0) && ($test % 5 == 0)) { 
    $total += $test; 
    } 
    elseif ($test % 3 == 0) { 
    $total += $test; 
    } 
    elseif ($test % 5 == 0) { 
    $total += $test; 
    } 

} 

echo $total; 

?> 

我覺得這是對形勢相當合乎邏輯的做法,儘管它似乎並沒有工作。我在這裏做錯了什麼?

親切的問候,桑德爾

/電子郵件:謝謝大家的幫助!

+1

'$ total = $ total + = $ test;' - double assignment,這就是問題 – RomanPerekhrest

+0

從語義上講,'$ total = $ total + = $ test;'有點多餘,因爲您可以將它寫爲: (1)'$ total = $ total + $ test;'或(2)'$ total + = $ test;' –

+0

我試過了,沒有工作。 – Sander

回答

-1

Remove = from + =你我想加兩次。

1

您要添加到$test$total,所以你既可以做: $total = $total + $test;$total += $test;,但不能同時!

您每次重置循環時也重置$total,因此您希望$total = 0;不在for循環之外。

試試這個:

<?php 
$total = 0; 
for ($test = 1; $test <= 20; $test++) { 

    if (($test % 3 == 0) && ($test % 5 == 0)) { 
    $total += $test; 
    } 
    elseif ($test % 3 == 0) { 
    $total += $test; 
    } 
    elseif ($test % 5 == 0) { 
    $total += $test; 
    } 

} 

echo $total; 

?> 
+0

因此,這項工作,因爲你使$總是一個全局變量?當我離開括號$總,它只是20 。Tnx btw :) – Sander

+0

這些任務可以正常工作,儘管它們比他們需要的更冗長。在循環內部復位計數器是個問題。 – miken32

+0

當您在for循環中設置'$ total = 0'時,您每次將'test'增加1時將其重置爲0.如果您想要累加和,則無法每次重置累加和當你添加'test'時,所以你想在你開始給'total'添加'test'之前將它重置爲0。 –

0

初始化$total進入for循環之前變量。

3
  1. 請勿在循環中初始化$total。否則它會在每次迭代時重置爲0,因此在循環之後它將只與最後一個數字相等,或者如果最後一個數字不能被3或5整除,則爲零。

  2. 你並不需要很多的條件。您可以使用一個或(||)與一個if


$total = 0; 

for ($test = 1; $test <= 20; $test++) { 
    if (($test % 3 == 0) || ($test % 5 == 0)) { 
     $total += $test; 
    }  
} 

echo $total; 
0

如果你有興趣在驗證你的代碼運行後話,我建議這爲便於使用:

$to_be_summed = array(); 
for($i = 1; $i <= 1000; ++$i) 
{ 
    if($i%3 === 0 && $i%5 === 0) 
    { 
     $to_be_summed[] = $i; 
    } 
} 
echo array_sum($to_be_summed); 

echo '<br><br>'; 

// See which numbers met the criteria 
echo '<pre>'.print_r($to_be_summed, true).'</pre>'; 
+0

我對陣列還不太瞭解,但是這讓我感興趣。雖然這測試$ i是否可以被3 && 5整除,但很容易變成3 || 5。我看到很多人使用$ i作爲變量,如果我可能會問,這背後有什麼理由嗎? – Sander

+0

@ user3236492數組很可能是關於PHP的**最好**的東西;沒有他們,PHP會非常艱鉅的使用。將數組看作項目列表,而不是'$ to_be_summed_1 ='3'; $ to_be_summed_2 ='6';'你有'$ to_be_summed [] ='3'; $ to_be_summed [] ='6';'現在迭代'foreach($ to_be_summed as $ v){echo $ v。'
';}'。 '$ i'通常用於for()'循環,因爲它是單詞「increment」的第一個字母。如果你在另一個for()內有'for()',那麼內部的for()應該使用'$ j','$ k'等等來避免覆蓋父類的for()'增量。 – MonkeyZeus

+0

謝謝!我一定會在進一步的作業中使用它。 – Sander

0

最簡單的解決方法是:

下面

文字是引用

而不是使用基於範圍/循環的解決方案,你可能希望利用更多的數學比蠻力。

有一種簡單的方法可以獲得數字的倍數總和,小於一個數字。例如,3至1000的倍數之和爲:3 + 6 + 9 + ... + 999其中可以被重寫爲:3 *(1 + 2 + 3 + ...)+ 333)

有一種簡單的方式來總結所有數字1-N:

Sum(1,N) = N*(N+1)/2 

因此,一個示例函數是

function unitSum($n) { 
    return ($n*($n+1))/2; 
} 

所以,現在越來越的3的倍數小於1000(也稱爲999)已被縮減爲:

3*unitSum((int)(999/3)) 

對於5的倍數,您可以這樣做:

5*unitSum((int)(999/5)) 

但有一個警告!這兩個數都是兩個數的倍數,例如15,30等。它們計數兩次,每次一次。所以爲了平衡這一點,你減去一次。

15*unitSum((int)(999/15)) 

所以總的計算公式如下:

$sum = 3*unitSum((int)(999/3)) + 5*unitSum((int)(999/5)) - 15*unitSum((int)(999/15)) 

所以現在,而不是循環在大組數字,並做比較,你只是做一些簡單的乘法!

相關問題