PHP while while循环并找到相同数字的平均值

时间:2018-03-08 13:42:07

标签: php

  1. 如何使用while循环来获取0到100之间可以除以3的数字?

  2. 然后找到这些数字的平均值?

  3. 这是我认为在第一部分中可行的,但没有。

    <?php
    $i = 3;
    while ($i < 99 && $i%3==0) {
        echo " $i <br />";
        $i++;
    }
    ?>
    

6 个答案:

答案 0 :(得分:1)

<?php
$i = 0;
$counter = 0;
$total = 0;
while ($i < 99) {
    if($i%3==0){
      $counter++;
      $total += $i;
    } 
    $i++;
}
$average = $total/$counter;
echo $average;
?>

答案 1 :(得分:0)

您可以使用modulo operator %。当一个项目可以通过模运算符值的右侧分割时,结果将为0.

for($c=1; $c< 100; $c++) {
   if($c % 3 === 0) {
      echo "$c is dividable by 3\n";
   }
}

现场直播:https://ideone.com/oF2C9B

基本上如果你有A % B之类的总和 只要可以从中减去B,B就会从A中减去。无论剩下什么都归还。

所以,如果您15 % 10 {}返回5,如果您30 % 10 {?}},则会返回0

现在是第二部分。你想要从你的问题中得到平均所有可分数为3的数字。

<?php
/**
 * We use an array to store all the numbers that can be divided by three
 */
$div_by_three = [];

/**
 * fill the array with values that can be divided by three
 */
for($c=1; $c< 100; $c++) {
   if($c % 3 === 0) {
      $div_by_three[] = $c;
   }
}
/**
 * Sum the array values into one number
 */
$sum = array_sum($div_by_three);
echo "The sum of those dividable by three is $sum\n";

/**
 * Divide the sum by array length
 */
$avg = $sum / count($div_by_three);
echo "The average of those dividable by three is $avg\n";

现场直播:https://ideone.com/NTrH4E

基本上这里的方法是array_sum(),以快速添加数组值,count()来获取数组的长度来计算平均值。

答案 2 :(得分:0)

$nums = [];

foreach(range(1, 99) as $i) {
    if ($i % 3 == 0) {
        $nums[] = $i;
    }
}
$avg = array_sum($nums) / count($nums);

echo implode(', ', $nums) . '<hr>';
echo 'Average: ' . $avg;

如果你想缩短时间:

$nums = array_filter(range(1, 99), function($num) {
    return $num % 3 == 0;
});
$avg = array_sum($nums) / count($nums);

echo implode(', ', $nums) . '<hr>';
echo 'Average: ' . $avg;

答案 3 :(得分:0)

关于第二个问题:

<?php
$i = 0;
$cnt = 0;
$sum = 0;
while ($i < 99) {
    if($i%3==0) {
        echo $i . "</br>";
        $cnt++;
        $sum += $i;
    }
    $i++;
}
$avg = $sum / $cnt;
echo "Average: $avg";

答案 4 :(得分:0)

    <?php
    $i = 3;
    while ($i < 99 ) {

        if ($i%3==0 ){
            $total = ($i+3)/3;
        }

        $i++;
    }
    echo $total;
    ?>

答案 5 :(得分:0)

第一次尝试不起作用的原因是因为循环条件仅在$i是三的倍数时才有效。这将在第二次迭代时不再有效。用英语:

$i = 3

# Iteration 1
is 3 less than 99 AND 3 an even divisor of 3?  YES
  do loop, and increment $i to 4.

# Iteration 2
is 4 less than 99 AND 4 an even divisor of 3?  NO

其他答案指出的诀窍很清楚每个部分的作用。 while循环的唯一目的是增加$i ,而$ i小于99 。因此,条件检查恰好是一个细节:&#34; $ i是否小于99?&#34;

同时,对于您想要回答的更高级别的问题,您可以在循环内使用if条件。

$i = 3;
$totalSum = 0;
$numDivisableByThree = 0;
while ( $i < 99 ) {
    if ( ($i % 3) == 0 ) {
        $totalSum += $i;
        $numDivisableByThree++;
    }
    $i++;
}

# careful, ensure that your algorithm found at least one item, else
# you may attempt a divide by zero
if ( $numDivisableByThree > 0 )
    $myAverage = $totalSum / $numDivisableByThree;
else
    $myAverage = "No Average (0 items found)";  # or perhaps false or null;

echo "Average of 3-divisable numbers between 1 and 99: $myAverage";

我认为这是一个简单的项目,但也认识到简单的&#34;暴力&#34;检查是非常低效的计算。考虑更简单地添加3次迭代的方法:

$i = 3
...
while ( $i < 99 ) {
    $totalSum += $i;
    $numDivisableByThree++;
    $i += 3
}
...

(注意不需要内部if条件)。

或者更好的是,使用算法直接计算:

$beg = 3;
$end = 99;  # ensure that 
$divisor = 3;
# if $beg is divisible by $divisor, then it won't be counted by the math;
# therefore, add 1 explicitly
if ($beg % $divisor == 0)
    return ((int)($end / $divisor)) - ((int)($beg / $divisor)) + 1;

return ((int)($end / $divisor)) - ((int)($beg / $divisor));