添加20以下的每个数字可被3和5整除

时间:2017-02-15 21:11:47

标签: php

我对这整个PHP业务都很陌生,并试图在ProjectEuler.com上做第一个挑战。简单问题:1000以下的数字可以被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;

?>

我认为这是一种非常符合逻辑的方法,虽然它似乎没有用。我在这里做错了什么?

亲切的问候,桑德

/ E:感谢所有人的帮助!

6 个答案:

答案 0 :(得分:3)

  1. 不要在循环中初始化<style> table { /*table-layout:fixed;*/ } td { max-width: 120px; } .text-box { max-width: 100px; } </style> 。否则它会在每次迭代时重置为$total,因此在循环之后它将仅等于最后一个数字,或者如果最后一个数字不能被三或五整除则为零。

  2. 你不需要那么多条件。您可以使用或(0)与||

  3. if

答案 1 :(得分: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;

?>

答案 2 :(得分:0)

在输入for循环之前初始化$total变量。

答案 3 :(得分: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>';

答案 4 :(得分:0)

最简单的解决方案是:

  

以下文字引用

与其使用基于范围/循环的解决方案相比,您可能希望利用更多的数学而不是暴力。

有一种简单的方法可以得到一个数的倍数之和,小于一个数。

例如,3到1000的倍数之和为:3 + 6 + 9 + ... + 999可以改写为:3 *(1 + 2 + 3 + ... + 333)< / p>

有一种简单的方法可以总结所有数字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))

所以现在而不是循环遍历大量数字,并进行比较,你只是做一些简单的乘法!

答案 5 :(得分:-1)

从= =删除=我想再加两次。