PHP模数运算问题

3

我是一名有用的助手,可以为您翻译文本。

我有一个问题,我正在尝试计算一个数字的最低质数,但我不理解PHP给出的结果。

如果我有这个数字:

 $number = 600851475143;

然后我对它取模:

$primes = array( 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97);

    foreach($primes as $key=>$value) {    
        if($number % $value == 0 ) {echo $value; break; }
    }

为什么 $value = 3?若 $value = 3,则 600851475143 / 3 应该是一个整数,但它并不是。因此,我不明白为什么那个 if() 语句返回 true?

当我运行它时,它没有打印 3 吗? - Tom Haigh
请看这个链接:http://codepad.org/cjCD14gJ - Eli
还有这个:http://codepad.org/R9l8wBuv - Eli
对于我来说,600851475143%3 == 2,但我在64位Linux上使用PHP 5.2.5。 我敢打赌你正在使用32位,因此您的最大整数更小。对我来说,php -r'var_dump(PHP_INT_MAX);' 返回int(9223372036854775807) - 在您的环境中尝试一下。 - Frank Farmer
3个回答

4

请查看此处的错误列表

% 在32位系统中无法处理大于2^31的数字,在64位系统中无法处理大于2^63的数字。请使用BCMOD替代。


是的,我刚刚发现了。这是因为它是一个浮点数。 - Eli
在我的64位平台上,使用PHP 5.2.5运行良好(我期望模数在这样的系统上适用于高达2^63的数字)。但是我相信,在32位平台上,模数仍然存在这个限制,这不应该让人感到惊讶。 - Frank Farmer

0

使用 PHP 5.2.8 版本时,它会像问题描述的那样失败。似乎取模运算符在大整数上不起作用。您应该考虑使用 bc_mod(任意精度取模):

<?php

$number = 600851475143;

$primes = array(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97);

    foreach($primes as $key=>$value)
    {    
        if($number % $value == 0 ) {echo $value."<br/>"; }
        if(bcmod($number, $value) == 0) {echo "bcmod ".$value."<br/>"; }
    }

?>

以上代码输出:

3

29

bcmod 71


0

我可能误解了它,但模数运算可以给你除法的余数,例如 600851475143 / 3 是 200283825047 余数为 2,这就是它返回给你的。


是的,我知道。那么$number % 3应该等于多少? - Eli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接