function find_highest_prime_factor($n)
{
for ($i = 2; $i <= $n; $i++)
{
if (bcmod($n, $i) == 0) //its a factor
{
return max($i, find_highest_prime_factor(bcdiv($n,$i)));
}
}
if ($i == $n)
{
return $n; //it's prime if it made it through that loop
}
}
更新:这是正确的答案,我的不好!
答案 0 :(得分:2)
除去最后的if语句,否则$i!=sqrt($n)
因为sqrt($ n)不是整数,你有一个未定义的返回值
function find_highest_prime_factor($n){
for ($i = 2; $i <= sqrt($n); $i++) //sqrt(n) is the upperbound
{
if (bcmod($n, $i) == 0) //its a factor
{
return max($i, find_highest_prime_factor(bcdiv($n,$i)));
}
}
return $n; //it's prime if it made it through that loop
}
答案 1 :(得分:1)
第11行应该是:
if ($i == ceil(sqrt($n)))
答案 2 :(得分:0)
从2开始并逐步减少1是低效的。至少分别检查2,然后每次从3步进2循环。使用2-4轮会更快。
当您递归时,您的代码会在试用因子2处再次启动。最好传递一个包含您到目前为止所达到的因子的第二个参数。然后,递归将不会回溯已经过测试的旧因素。