2010-08-10 6 views
3

J'ai adapté ceci d'un exemple que j'ai trouvé sur le net ...Quel est le moyen le plus simple d'obtenir un ratio en PHP de plusieurs nombres?

function ratio($a, $b) { 
    $_a = $a; 
    $_b = $b; 

    while ($_b != 0) { 

     $remainder = $_a % $_b; 
     $_a = $_b; 
     $_b = $remainder; 
    } 

    $gcd = abs($_a); 

    return ($a/$gcd) . ':' . ($b/$gcd); 

} 

echo ratio(9, 3); // 3:1 

Maintenant, je le veux utiliser func_get_args() et retourner les rapports pour plusieurs numéros. Cela ressemble à un problème récursif, et la récursivité me fait peur (surtout quand mes solutions boucle infiniment)!

Comment est-ce que je modifierais ceci pour prendre autant de paramètres que je voulais?

Merci

+0

déduis de c réponse: http://stackoverflow.com/questions/527860/calculate-a-ratio-in-c –

+0

Que voulez-vous dire par «les ratios pour plusieurs nombres»? Quelque chose comme '2: 3: 5'? Ce que vous pourriez faire est d'abord de calculer les factorisations premières pour chaque élément de la liste des nombres. Le produit des facteurs premiers dans l'intersection est le plus grand dénominateur commun. Les ratios respectifs sont ensuite calculés comme dans votre exemple. –

Répondre

5

1er, essayez cette fonction GCD http://php.net/manual/en/function.gmp-gcd.php Ou bien vous devez définir une fonction GCD comme

function gcd($a, $b) { 
     $_a = abs($a); 
     $_b = abs($b); 

     while ($_b != 0) { 

      $remainder = $_a % $_b; 
      $_a = $_b; 
      $_b = $remainder; 
     } 
     return $a; 
    } 

modifier ensuite la fonction de rapport

function ratio() 
    { 
     $inputs = func_get_args(); 
     $c = func_num_args(); 
     if($c < 1) 
      return ''; //empty input 
     if($c == 1) 
      return $inputs[0]; //only 1 input 
     $gcd = gcd($input[0], $input[1]); //find gcd of inputs 
     for($i = 2; $i < $c; $i++) 
      $gcd = gcd($gcd, $input[$i]); 
     $var = $input[0]/$gcd; //init output 
     for($i = 1; $i < $c; $i++) 
      $var .= ':' . ($input[$i]/$gcd); //calc ratio 
     return $var; 
    } 
+0

Merci! GMD est-il installé sur la plupart des installations PHP? – alex

Questions connexes