PHP数组的简单计算


PHP Simple Calculation with an Array

所以我有一个简单的for循环从任何给定的数字(get)获得这个结果。
1 + 2 + 3 + 4 = 10

$num = intval($_GET["number"]);
$total = 0;
for ($i = 1; $i <= $num; $i++) {
    echo $i;
    if ($i != $num) {
        echo " + ";
    } 
    $total += $i;
}
    echo " = " . $total;

现在我想展示每一步的计算
1 + 2 = 3
1 + 2 + 3 = 6
1 + 2 + 3 + 4 = 10
它应该用数组来完成,但我似乎不知道算法是什么。我想我忽略了一些简单的东西。

试试这样:

<?php
$num = intval($_GET["number"]);
//add all numbers to an array
$numbers = array();
for ($i = 1; $i <= $num; $i++)
{
  $numbers[] = $i;
  //show each array element with ' + ' in between the elements
  echo implode(' + ', $numbers);
  //show total sum
  echo " = " . array_sum($numbers) . "'n";
}
?>

请注意,如果$_GET['number']为零或甚至低于零,则此操作不起作用。

这是我能想到的最简单的方法…

$num = intval($_GET['number']);
$intArray = range(1,$num);
echo implode(" + ",$intArray)." = ".array_sum($intArray);

实际上不需要循环来执行等差数列。这样的等差数列可以用公式n * (n[-1] + n[1]) / 2在常数时间内计算。

以4为例,其中n1 = 1, n2 = 2, n3 = 3, n4 = 4等于4 * (4 + 1) / 2 == 10

function progression($n) {
    return $n * ($n + 1) / 2;
}
echo progression(4); // 10

然而,要显示任意给定步骤的级数的结果,只需限制该级数的上界(即$n)。

$n = 4;
for ($i = 1; $i <= $n; $i++) {
    $operands = implode('+', range(1, $i));
    echo $operands . " = " . progression($i), "'n";
}

输出<>之前1 = 11+2 = 31+2+3 = 61+2+3+4 = 10之前<标题> 泛化

这适用于任何线性等差数列,无论上界/下界如何。例如,从5到8的进程仍然是4 * (5 + 8) / 2,从而得到26

所以你可以将这个函数修改为任何线性等差数列的更一般的解。

function progression($size, $start = 1) {
    return $size * ($start + ($size + $start - 1)) / 2;
}
$n = 4;
$start = 5;
for ($i = $start; $i <= $n + $start - 1; $i++) {
    $operands = implode('+', range($start, $i));
    echo $operands . " = " . progression($i - $start + 1, $start), "'n";
}

输出<>之前5 = 55+6 = 115+6+7 = 185+6+7+8 = 26

因此,假设您正在做$_GET['number']数字的范围,那么您可以做类似的事情(参见代码中的注释以获得进一步的解释):

//This will create an array from 1 to number inclusive
$nums = range(1, $_GET['number']);
//The nums that have been used
$used = array();
//Now loop over that array
foreach($nums as $num){
    $used[] = $num; //Add this number to used
    if(count($used) > 1){//Dont care about first loop
        echo  implode(' + ', $used); // put all elements together by + sign
        echo ' = ' . array_sum($used) . "<br>"; //Show total plus a break
    }
}
<?php
$num = intval($_GET["number"]);
$terms = [1];
for ($i = 2; $i <= $num; $i++) {
    $terms[] = $i;
    $sum = array_sum($terms);
    echo implode(' + ', $terms) . ' = ' . $sum . PHP_EOL;
}

最大限度地使用PHP数组相关函数:

$num = intval($_GET["number"]);
$array = range(1, $num);
for ($i = 2; $i <= $num; $i ++)
{
    $slice = array_slice($array, 0, $i);
    $total = array_sum($slice);
    echo implode(" + ", $slice) . " = " . $total . PHP_EOL;
}

与array_push

$num = intval($_GET["number"]);
$array = array(1);
for ($value = 2; $value <= $num; $value ++)
{
    array_push($array, $value);
    echo implode(" + ", $array) . " = " . array_sum($array) . PHP_EOL;
}

1 + 2 = 3
1 + 2 + 3 = 6
1 + 2 + 3 + 4 = 10