Упростить фракцию

Как я могу упростить фракцию в 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; 

Алгоритм довольно прост:

  • извлеките оба значения из строки.
  • найти их наибольший общий делитель ($ gcd) (например, с евклидовым алгоритмом )
  • разделите оба значения на $ gcd
  • перестроить строку с найденными значениями