3

我必须计算a % b两个非常大的数字。我不能使用默认的模运算符,因为ab更大PHP_INT_MAX,所以我必须将它们作为“字符串”处理。

我知道存在特殊的数学库,例如BCorGMP但我不能使用它们,因为我的应用程序可能会托管在共享主机上,而这些未启用。我必须在 php 中编写一个函数来完成这项工作。该函数将两个字符串(两个数字)作为参数并且必须返回a % b,但我不知道如何开始?如何解决这个问题呢?

4

4 回答 4

3

自 PHP 4.0.4 起,libbcmath 与 PHP 捆绑在一起。此扩展不需要任何外部库。这些函数仅在 PHP 配置了 --enable-bcmath 时可用。

Windows 版本的 PHP 内置了对这个扩展的支持。您无需加载任何其他扩展即可使用这些功能。您应该能够自己启用这些功能,而无需托管公司采取任何行动。

于 2012-12-16T17:50:27.120 回答
2

我想到了这个解决方案: $n 代表一个巨大的数字, $m (不是那么大)模数。

function getModulus($n, $m)
{
    $a = str_split($n);
    $r = 0;

    foreach($a as $v)
    {
        $r = ((($r * 10) + intval($v)) % $m);
    }

    return $r;
}

希望它可以帮助某人,

于 2014-02-06T16:40:38.573 回答
1

根据您的处理器,如果使用 64 位机器 2^63-1 并且如果使用 32 位机器 2^31-1 应该为您提供您的机器可以计算的小数长度。在此之上,您将得到错误的值。您可以通过将您的号码分成块来做同样的事情。示例:我的数字是十进制的 18,因此分成 9/7/2 = 18 的块。计算第一个块的 mod。将第一个的 mod 附加到第二个块的前面。示例:第一个 mod 的结果 = 23,因此是 23XXXXXXX。找到生成的 23XXXXXXX 的 mod。将mod添加到最后一个块。示例:mod = 15 然后 15XX。

$string = '123456789123456789'; // 18 decimal long
$chunk[0] = '123456789'; // 9 decimal long
$chunk[1] = '1234567'; // 7 decimal long
$chunk[2] = '89'; // 2 decimal long
$modulus = null;
foreach($chunk as $value){
$modulus = (int)($modulus.$value) % 45;
}

上面的结果 $modulus 应该与

$modulus = $tring % 45 迟到总比平均好。希望这会有所帮助。有类似方法的人吗?

于 2014-01-12T12:15:10.637 回答
0

您可以使用fmod大于MAX_INT

在此处阅读有关它的更多信息

http://php.net/manual/en/function.fmod.php

于 2012-12-16T17:49:14.037 回答