寻找超过2个整数的GCD(最大公约数)?

Ala*_*blo 7 php math greatest-common-divisor

我已经有一个找到2个数字的GCD的函数.

function getGCDBetween($a, $b)
{
    while ($b != 0)
    {
        $m = $a % $b;
        $a = $b;
        $b = $m;
    }
    return $a;
}
Run Code Online (Sandbox Code Playgroud)

但现在,我想扩展此功能以找到N点的GCD.有什么建议吗?

Adr*_*rat 16

有一种更优雅的方式来做到这一点:

// Recursive function to compute gcd (euclidian method)
function gcd ($a, $b) {
    return $b ? gcd($b, $a % $b) : $a;
}
// Then reduce any list of integer
echo array_reduce(array(42, 56, 28), 'gcd'); // === 14
Run Code Online (Sandbox Code Playgroud)

如果要使用浮点,请使用近似值:

function fgcd ($a, $b) {
    return $b > .01 ? fgcd($b, fmod($a, $b)) : $a; // using fmod
}
echo array_reduce(array(2.468, 3.7, 6.1699), 'fgcd'); // ~= 1.232
Run Code Online (Sandbox Code Playgroud)

您可以在PHP 5.3中使用闭包:

$gcd = function ($a, $b) use (&$gcd) { return $b ? $gcd($b, $a % $b) : $a; };
Run Code Online (Sandbox Code Playgroud)


Mr.*_*ama 7

不得不做一些挖掘,但这是我发现的.

三个数字的gcd可以计算为gcd(a,b,c)= gcd(gcd(a,b),c),或者通过应用交换性和相关性以某种不同的方式计算.这可以扩展到任意数量的数字.

您可以使用以下内容:

function multiGCD($nums)
{
    $gcd = getGCDBetween($nums[0], $nums[1]);

    for ($i = 2; $i < count($nums); $i++) { $gcd = getGCDBetween($gcd, $nums[$i]); }

    return $gcd;
}
Run Code Online (Sandbox Code Playgroud)