2013-07-17 138 views
1

do-while循环可以有多个条件吗?如果是这样,我无法弄清楚为什么下面的代码在除了第一个条件之外都失败了。使用多条件同时循环

功能...

function gcf($a,$b) { 
$a = abs($a); $b = abs($b); 
if($a < $b) list($b,$a) = Array($a,$b); 
if($b == 0) return $a; 
$r = $a % $b; 
while($r > 0) { 
    $a = $b; 
    $b = $r; 
    $r = $a % $b; 
} 
return $b; 
} 


function factors($n){ 
$factors_array = array(); 
for ($x = 1; $x <= sqrt(abs($n)); $x++) 
{ 
    if ($n % $x == 0) 
    { 
     $z = $n/$x; 
     array_push($factors_array, $x, $z); 
    } 
} 
return $factors_array; 
} 

代码...

$a = $b; 

do{ 
    $a = mt_rand(8, 100); 
    $a_factors_array = factors($a); 

    $b = mt_rand(8, 100); 
    $b_factors_array = factors($b); 

} while ($a == $b && count($a_factors_array) < 4 && count($b_factors_array) < 4 && gcf($a, $b) == 1); 

echo $a . '<br>'; 
echo $b . '<br>'; 

echo count($a_factors_array) . '<br>'; 
echo count($b_factors_array) . '<br>'; 

echo gcf($a, $b) . '<br>'; 

我一直为$ a和$ b具有小于4个因素,并有1 GCF得到的数字。有任何想法吗?

+0

哇哇哇。我认为'while($ a == $ b &&'可能是错误的,我认为你的意思是'while($ a == $ b ||(otherstuff));'否则,你会在第一遍之后停止A <> B. –

回答

2

你需要||而不是&&。只要任意符合您的条件之一就可以重复循环。目前,只有条件满足时才会重复循环,如果全部为

+0

Gahhh !!! Right ||而不是&&。Do-while循环从常规的while循环在逻辑上是向后的,谢谢 – gtilflm

+0

您可以反转每个条件并使用'&&'。例如' $ check = $ a!= $ b &&(count($ a_factors_array)> = 4)...;然后,在循环中写入'while($ check === false)'。任何检查都会失败,“你正在编写”,而不是所有的检查都可以“,这使得它更容易阅读,而且你可以在没有额外变量的情况下完成:只需将整个条件放在额外的圆括号中并添加'=== false '之后,但我认为这使得它更易于使用额外的变量 – GolezTrol

0

我认为你有一个与运算,你的意思了手术室:

do{ 
    $a = mt_rand(8, 100); 
    $a_factors_array = factors($a); 

    $b = mt_rand(8, 100); 
    $b_factors_array = factors($b); 

} while ($a == $b || count($a_factors_array) < 4 || count($b_factors_array) < 4 || gcf($a, $b) == 1); 

随着你的方式,while停止,如果$a !== $b这可能不是你想要的。