Php 20以下的每一个数字加上3和5
我对整个PHP业务都很陌生,并尝试在ProjectEuler.com上完成第一个挑战。简单问题:1000以下哪些数字可以被3和/或5整除?把这些数字加起来 因为我的代码开始吐出令人难以置信的长串数字,所以我现在坚持使用20 这是我正在使用的代码:Php 20以下的每一个数字加上3和5,php,Php,我对整个PHP业务都很陌生,并尝试在ProjectEuler.com上完成第一个挑战。简单问题:1000以下哪些数字可以被3和/或5整除?把这些数字加起来 因为我的代码开始吐出令人难以置信的长串数字,所以我现在坚持使用20 这是我正在使用的代码: <?php for ($test = 1; $test <= 20; $test++) { $total = 0; if (($test % 3 == 0) && ($test % 5 == 0)) {
<?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:谢谢大家的帮助 Remove=from+=您的我认为添加了两次。Remove=from+=您的我认为添加了两次。您想将
$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;
?>
您想将$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;
?>
在输入for循环之前初始化$total
变量。在输入for循环之前初始化$total
变量
不要在循环中初始化$total
。否则,每次迭代它都会重置为0
,因此在循环之后,它将只等于最后一个数字,或者如果最后一个数字不能被3或5整除,它将等于0
你不需要那么多条件。如果
,您可以将or(|
)与一个一起使用
$total=0;
对于($test=1;$test)
不要在循环中初始化$total
。否则每次迭代它都会重置为0
,因此在循环后,它将只等于最后一个数字,如果最后一个数字不能被3或5整除,则等于0
您不需要那么多条件。您只需将or(|
)与一个if
一起使用即可
$total=0;
对于($test=1;$test如果您有兴趣在代码运行后验证代码,那么为了便于使用,我建议这样做:
$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>';
$to_be_summed=array();
对于($i=1;$i如果您有兴趣在代码运行后验证代码,那么为了便于使用,我建议您这样做:
$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>';
$to_be_summed=array();
对于($i=1;$i而言,最简单的解决方案是:
下文引述
与使用基于范围/循环的解决方案相比,您可能希望更多地利用数学而不是暴力
有一种简单的方法可以得到一个数的倍数之和,小于一个数
例如,3到1000的倍数之和为:3+6+9+…+999,可以重写为:3*(1+2+3+…+333)
有一种简单的方法来总结所有数字1-N:
function unitSum($n) {
return ($n*($n+1))/2;
}
所以一个示例函数是
3*unitSum((int)(999/3))
因此,现在所有小于1000的倍数(也就是999)已减少到:
5*unitSum((int)(999/5))
您可以对5的倍数执行相同操作:
15*unitSum((int)(999/15))
但是有一个警告!这两个数都是它们的倍数,比如15,30,等等。它计算两次,一次一次。所以为了平衡这一点,你减去一次
$sum = 3*unitSum((int)(999/3)) + 5*unitSum((int)(999/5)) - 15*unitSum((int)(999/15))
总的来说,方程是:
因此,现在,您不必在一大组数字上循环,也不必进行比较,只需进行一些简单的乘法!最简单的解决方案是:
下文引述
与使用基于范围/循环的解决方案相比,您可能希望更多地利用数学而不是暴力
有一种简单的方法可以得到一个数的倍数之和,小于一个数
例如,3到1000的倍数之和为:3+6+9+…+999,可以重写为:3*(1+2+3+…+333)
有一种简单的方法来总结所有数字1-N:
function unitSum($n) {
return ($n*($n+1))/2;
}
所以一个示例函数是
3*unitSum((int)(999/3))
因此,现在所有小于1000的倍数(也就是999)已减少到:
5*unitSum((int)(999/5))
您可以对5的倍数执行相同操作:
15*unitSum((int)(999/15))
但是有一个警告!这两个数都是它们的倍数,比如15,30,等等。它计算两次,一次一次。所以为了平衡这一点,你减去一次
$sum = 3*unitSum((int)(999/3)) + 5*unitSum((int)(999/5)) - 15*unitSum((int)(999/15))
总的来说,方程是:
所以现在,你不用循环一大组数字,做比较,你只需要做一些简单的乘法!$total=$total+=$test;
-双赋值,这就是问题所在。从语义上讲,$total=$total+=$test;
有点多余,因为你可以将它写成:(1)$total=$total+$test;
或(2)$total+=$test;
我尝试不使用,但无效。您每次迭代循环时都会重置$total,请尝试将其移到for循环之外,如我下面的回答所示。您甚至不搜索解决方案:(这比你写的更简单,…你只需要计算3个分开的数字,加上其中两个(3和5除法)和减法(将两个数字像15一样分开的数字)第三个$total=$total+=$test;
-双重赋值,这就是问题所在。从语义上说,$total=$total+=$test;
有点多余,因为您可以将其编写为:(1)$total=$total+$test;
或(2)$total+=$test;
我尝试不使用$total,但不起作用。每次迭代循环时,您都会重置$total,尝试将其移出for循环,如下面的答案所示。您甚至不搜索解决方案:(这比您编写的更简单,…您只需计算3个分开的数字,然后添加其中两个(3和5除法)和减法(表示