Php 20以下的每一个数字加上3和5

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业务都很陌生,并尝试在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:谢谢大家的帮助

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除法)和减法(表示