我写了一个脚本来找到600851475143的因子,它位于2到100之间。但是当我在本地机器上运行脚本时,当我在Phpfiddle.org上运行它时,我获得了不同的值。在Phpfiddle上,我得到了正确的答案71但是在我的机器上,脚本简单返回100这是错误的。可能是什么导致了这个?代码在
之下<?php
$n = 600851475143;
for ($i=2; $i < 100; $i++) {
$result = ($n/$i);
if (is_int($result)) {
break;
return $i;
}
}
echo $i;
?>
答案 0 :(得分:0)
问题是你的除法结果总是float
,所以你的情况永远不会匹配。
一种可能的解决方案是将其转换为字符串并检查所有字符是否都是数字:
if (ctype_digit((string) $result)) {
这会产生71
,请参阅an example。
答案 1 :(得分:0)
PHP Manual: Arithmetic Operators:
除非两个操作数是整数(或转换为整数的字符串),否则除法运算符(“/”)返回一个浮点值,并且数字可以被整除,在这种情况下,将返回一个整数值。
您的本地计算机使用的是32位整数,其中最大的是2147483647.您可以使用32位版本,也可以使用7之前的PHP版本。
因为600851475143大于你的最大整数,所以它被转换成一个浮点数,因此你的除法也将总是返回一个浮点数。
如果你
var_dump(600851475143/71)
在您的本地系统上
float(8462696833)
任何使用64位整数的系统都会给你
int(8462696833)
as 600851475143和71完全在64位范围内。
一种适用于32位和64位系统的方法是使用fmod()
检查是否存在除法余数,例如:
$n = 600851475143;
for ($i=2; $i < 100; $i++) {
if (!fmod($n, $i)) {
break;
}
}
echo $i;
无论整数大小如何,都会给你71
。