2012-09-13 11 views
7

Come posso semplificare una frazione in PHP?Semplificare una frazione

Ad esempio, la conversione da 40/100 a 2/5.

L'unico modo che potrei pensare è quello di fare una fattorizzazione primaria su entrambi i numeri e confrontare come i risultati, ma non sono nemmeno sicuro di come farlo.

+3

Come su questa funzione http://forrst.com/posts/PHP_simplify_fraction-9rg – user1477388

risposta

20

Quando si semplificare una frazione, dividi il numeratore e il denominatore per il loro massimo comun divisore.

Quindi tutto ciò che serve è calcolare il GCD dei due numeri. Non c'è alcuna funzione built-in per questo, ma è abbastanza facile da implementare il euclidean algorithm:

function gcd($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; 
} 

Poi basta dividere la parte superiore e inferiore da quello.

function simplify($num,$den) { 
    $g = gcd($num,$den); 
    return Array($num/$g,$den/$g); 
} 
var_export(simplify(40,100)); // Array(2,5) 
1

L'algoritmo è piuttosto semplice:

  • estrarre entrambi i valori da una stringa.
  • trovano il loro massimo comun divisore ($ GCD) (con Euclidean algorithm, per esempio)
  • divide entrambi i valori di $ MCD
  • ricostruire la stringa con i valori trovati
2

Se si dispone di PHP gmp estensione, si può fare questo.

$num = 40; 
$den = 100; 
$gcd = gmp_intval(gmp_gcd((string)$num, (string)$den)); 

$new_num = $num/$gcd; 
$new_den = $den/$gcd;