我必须计算a % b
两个非常大的数字。我不能使用默认的模运算符,因为a
和b
更大PHP_INT_MAX
,所以我必须将它们作为“字符串”处理。
我知道存在特殊的数学库,例如BC
orGMP
但我不能使用它们,因为我的应用程序可能会托管在共享主机上,而这些未启用。我必须在 php 中编写一个函数来完成这项工作。该函数将两个字符串(两个数字)作为参数并且必须返回a % b
,但我不知道如何开始?如何解决这个问题呢?
自 PHP 4.0.4 起,libbcmath 与 PHP 捆绑在一起。此扩展不需要任何外部库。这些函数仅在 PHP 配置了 --enable-bcmath 时可用。
Windows 版本的 PHP 内置了对这个扩展的支持。您无需加载任何其他扩展即可使用这些功能。您应该能够自己启用这些功能,而无需托管公司采取任何行动。
我想到了这个解决方案: $n 代表一个巨大的数字, $m (不是那么大)模数。
function getModulus($n, $m)
{
$a = str_split($n);
$r = 0;
foreach($a as $v)
{
$r = ((($r * 10) + intval($v)) % $m);
}
return $r;
}
希望它可以帮助某人,
根据您的处理器,如果使用 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 迟到总比平均好。希望这会有所帮助。有类似方法的人吗?