如何使用while循环来获取0到100之间可以除以3的数字?
然后找到这些数字的平均值?
这是我认为在第一部分中可行的,但没有。
<?php
$i = 3;
while ($i < 99 && $i%3==0) {
echo " $i <br />";
$i++;
}
?>
答案 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));