如何在不使用 bcmod 的情况下用模计算一个非常长的数字?
How can I calculate a really long number with modulo without using bcmod?
bcmod 功能已停用,我将无法激活它,因为它不是我自己的服务器。
出于某种原因,我需要计算一个长度至少为 24 且模数为 97 的整数。
整数不能那么长,这就是为什么它不能工作...
我已经用简单的运算符“%”和“fcmod”库尝试过了,但是这个 returns 我完全错了数字。
有人知道我是否可以在没有任何其他库的情况下自己解决这个问题,或者我真的需要“bcmod”吗?
这将是示例代码:
123456789101112131415171%97
真正的答案是 96
但它 returns 我 -94
如果您的数字太大,您可以将问题分成几个较小数字的步骤。一个例子:
假设我们以 3 位数为步长执行此操作。因此,1550 % 16
与第一次执行 155 % 16
相同,即 11
。在第一步之后,我们将结果与整数的剩余部分相结合。即:11
和 0
得到 110
。我们现在只剩下 3 位数字,所以我们做 110 % 16
即 14
。所以结果是 14
.
我们可以在一个函数中实现这个,我一次使用8位数字,因为它更快:
function modulo($value, $modulo)
{
while ((strlen($value) > strlen($modulo)) ||
(intval($value) >= $modulo)) {
$head = substr($value, 0, 8);
$tail = substr($value, 8);
$value = ($head % $modulo) . $tail;
}
return $value;
}
现在如果我们这样做:
$value = "123456789101112131415171";
$modulo = 97;
echo modulo($value, $modulo);
我们得到 96
。注意大整数怎么是字符串,不然不行。此函数中正在进行大量隐式类型转换。
参见:PHP Sandbox。
可以使用更短的版本,但功能相同:
function modulo($value, $modulo)
{
while ((strlen($value) > strlen($modulo)) ||
(intval($value) >= $modulo)) {
$value = (substr($value, 0, 8) % $modulo) . substr($value, 8);
}
return $value;
}
参见:PHP Sandbox。
bcmod 功能已停用,我将无法激活它,因为它不是我自己的服务器。
出于某种原因,我需要计算一个长度至少为 24 且模数为 97 的整数。 整数不能那么长,这就是为什么它不能工作...
我已经用简单的运算符“%”和“fcmod”库尝试过了,但是这个 returns 我完全错了数字。
有人知道我是否可以在没有任何其他库的情况下自己解决这个问题,或者我真的需要“bcmod”吗?
这将是示例代码:
123456789101112131415171%97
真正的答案是 96
但它 returns 我 -94
如果您的数字太大,您可以将问题分成几个较小数字的步骤。一个例子:
假设我们以 3 位数为步长执行此操作。因此,1550 % 16
与第一次执行 155 % 16
相同,即 11
。在第一步之后,我们将结果与整数的剩余部分相结合。即:11
和 0
得到 110
。我们现在只剩下 3 位数字,所以我们做 110 % 16
即 14
。所以结果是 14
.
我们可以在一个函数中实现这个,我一次使用8位数字,因为它更快:
function modulo($value, $modulo)
{
while ((strlen($value) > strlen($modulo)) ||
(intval($value) >= $modulo)) {
$head = substr($value, 0, 8);
$tail = substr($value, 8);
$value = ($head % $modulo) . $tail;
}
return $value;
}
现在如果我们这样做:
$value = "123456789101112131415171";
$modulo = 97;
echo modulo($value, $modulo);
我们得到 96
。注意大整数怎么是字符串,不然不行。此函数中正在进行大量隐式类型转换。
参见:PHP Sandbox。
可以使用更短的版本,但功能相同:
function modulo($value, $modulo)
{
while ((strlen($value) > strlen($modulo)) ||
(intval($value) >= $modulo)) {
$value = (substr($value, 0, 8) % $modulo) . substr($value, 8);
}
return $value;
}
参见:PHP Sandbox。