简化分数

时间:2012-09-13 18:45:29

标签: php

如何简化PHP中的分数?

例如,将40/100转换为2/5

我能想到的唯一方法是对两个数字进行素数分解并比较结果,但我不确定如何做到这一点。

4 个答案:

答案 0 :(得分:22)

当你简化分数时,你将分子和分母除以它们的最大公约数。

所以你需要的只是计算两个数字的GCD。没有内置函数,但实现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;
}

然后将顶部和底部分开。

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

答案 1 :(得分:3)

如果您有PHP gmp扩展名,则可以执行此操作。

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

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

答案 2 :(得分:1)

算法非常简单:

  • 从字符串中提取两个值。
  • 找到他们最大的公约数($ gcd)(例如Euclidean algorithm
  • 将两个值除以$ gcd
  • 使用找到的值重建字符串

答案 3 :(得分:0)

这是一个简单的递归PHP函数

class TickerList(APIView):

    def post(self, request, format=None):
        serializer = TickerSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)```

用法:


<?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;
  }
}