Как я могу упростить фракцию в PHP?
Например, преобразование 40/100
в 2/5
.
Единственный способ, который я мог бы подумать, – сделать простой факторизацию на обоих числах и сравнить как результаты, но я не совсем уверен, как это сделать.
Когда вы упрощаете дробь, вы делите числитель и знаменатель на их наибольший общий делитель.
Итак, вам нужно всего лишь вычислить GCD двух чисел. Для этого нет встроенной функции, но достаточно просто реализовать алгоритм евклидова :
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; }
Затем просто разделите сверху и снизу.
function simplify($num,$den) { $g = gcd($num,$den); return Array($num/$g,$den/$g); } var_export(simplify(40,100)); // Array(2,5)
Если у вас расширение PHP gmp
, вы можете это сделать.
$num = 40; $den = 100; $gcd = gmp_intval(gmp_gcd((string)$num, (string)$den)); $new_num = $num / $gcd; $new_den = $den / $gcd;
Алгоритм довольно прост: