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