用数组进行PHP简单计算

4

所以我有一个简单的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
这应该使用一个数组完成,但是我好像无法找到算法。我觉得我在这里忽略了某些简单的东西。


1
每次迭代将值 $i 添加到数组中。然后您想使用 implode() 打印计算结果,并使用 array_sum() 获取结果。 - Rizier123
@Rizier123 我会尝试的!谢谢。 - Michiel Nuyts
@Sherif 哎呀,那是个打错字了! - Michiel Nuyts
1
你可能会对 range() 函数感兴趣。执行 $nums = range(1, $num); 将给你一个整数数组。 - gen_Eric
1 + 2 + 3 + 4 = (4 x (4 +1)) / 2 - Dominique Lorre
如果您遇到困难或混淆,请在此处发布您的代码,并解释您遇到的问题。 - Rizier123
6个回答

1
尝试像这样做一些事情:

<?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']为零或小于零,则此方法无效。

不应该关闭 <?php 标签,因为这可能会导致意外写入空格到输出缓冲区。 - Zac Crites
您的 implode 参数顺序错误。 - Zac Crites
@ZacCrites: 嗯,对于这个例子来说无所谓,但另一方面,打开一个<?php标签却不关闭它感觉有点奇怪。 - Striezel
关于参数:根据PHP文档的说明,你只对了一半。implode()可以接受两种顺序的参数,这就是为什么当我测试脚本时它也能正常工作的原因。无论如何,我已经改变了顺序以避免混淆。 - Striezel
https://dev59.com/XW855IYBdhLWcg3wUSkW - Zac Crites

1

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

例如,4的等差数列,其中 n1 = 1n2 = 2n3 = 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 = 1
1+2 = 3
1+2+3 = 6
1+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 = 5
5+6 = 11
5+6+7 = 18
5+6+7+8 = 26

很好的解释!谢谢。 - Michiel Nuyts
1
@MichielNuyts 当然,没问题。如果您觉得这个答案有帮助,请不要忘记点赞或接受它,这样其他人在遇到相同或类似问题时也可以更容易地找到它。 - Sherif

1

以下是我能想到的最简单的方法...

$num = intval($_GET['number']);
$intArray = range(1,$num);

echo implode(" + ",$intArray)." = ".array_sum($intArray);

0
假设您正在使用$_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
    }
}

-1
<?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;
}

-1

追求最大化利用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接