2013-07-17 133 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這可能不是你想要的。