9

PHPで分数を単純化するにはどうすればよいですか?

たとえば、 に変換40/1002/5ます。

私が考えることができる唯一の方法は、両方の数値で素因数分解を行い、同様の結果を比較することですが、それを行う方法もよくわかりません。

4

4 に答える 4

27

分数を整理するときは、分子と分母をそれらの最大公約数で割ります。

したがって、必要なのは 2 つの数値の 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)
于 2012-09-13T18:50:19.573 に答える
3

PHPgmp拡張機能があれば、これを行うことができます。

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

$new_num = $num / $gcd;
$new_den = $den / $gcd;
于 2012-09-13T18:53:37.707 に答える
3

これは単純な再帰的な PHP 関数です。


<?php

  function reduceFraction($numerator, $denominator)
  {
    $gcd = findGreatestCommonDenominator($numerator, $denominator);

    return [$numerator / $gcd, $denominator / $gcd];
  }


  function findGreatestCommonDenominator($a, $b)
  {
    return $b ? findGreatestCommonDenominator($b, $a % $b) : $a;
  }
}

利用方法 :


<?php $reduced = reduceFraction(40,100); // returns [2,5] ?>
于 2019-11-22T15:27:33.883 に答える
1

アルゴリズムは非常に単純です。

  • 文字列から両方の値を抽出します。
  • それらの最大公約数 ($gcd) を見つけます (たとえば、ユークリッド アルゴリズムを使用)
  • 両方の値を $gcd で割る
  • 見つかった値で文字列を再構築します
于 2012-09-13T18:48:38.830 に答える