我对这整个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:感谢所有人的帮助!
答案 0 :(得分:3)
不要在循环中初始化<style>
table {
/*table-layout:fixed;*/
}
td {
max-width: 120px;
}
.text-box {
max-width: 100px;
}
</style>
。否则它会在每次迭代时重置为$total
,因此在循环之后它将仅等于最后一个数字,或者如果最后一个数字不能被三或五整除则为零。
你不需要那么多条件。您可以使用或(0
)与||
。
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)
从= =删除=我想再加两次。