2011-08-18 5 views
2
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

예제 입력을 제공 할 수 있습니까? – webbiedave

+1

'($ i == $ n)'이 중복되는 경우 항상 true입니다. –

답변

2

는 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 
} 
+0

아직받지 못하고 있습니다. 그래도 가장 높은 소수입니다. 내가 한 일과 답을 바꾸는 것 같지 않습니다. – babonk

+0

이것은 첫 번째 루프를 통과하는 경우 소수가되어야하며 다시 테스트 할 필요가 없습니다. ... – Jonah

+0

이 버전이 14에 대한 오류를 수정했기 때문에 어떤 대답을 시도하십니까 –

1

라인 (11)은 다음과 같아야합니다

if ($i == ceil(sqrt($n))) 
+0

당신 sqrt 최적화 괜찮 았어, 내 처음 대답이 잘못되었습니다. 원래 코드로 돌아가서 위의 변경을하면 모든 것이 좋습니다. 내 변경 사항과 함께 OP의 원본 코드에 링크 : http://codepad.viper-7.com/1aODAo – Jonah

+0

이 변경 사항이 작동하지 않는 것 같습니다 : http://codepad.viper-7.com/C84m7z – babonk

0

시작이 정수가 아닌 $i!=sqrt($n) 때문에, 그렇지 않은 경우 최종 if 문을 제거하기 2에서 1로 스테핑하는 것은 비효율적입니다. 적어도 2를 개별적으로 확인한 다음 매번 3 단계에서 반복하십시오. 2-4 바퀴를 사용하는 것이 더 빠릅니다.

코드를 재귀 적으로 실행하면 평가판 2에서 다시 시작됩니다. 지금까지 도달 한 요소를 포함하는 두 번째 매개 변수를 전달하는 것이 좋습니다. 그런 다음 재귀가 이미 테스트 된 낡은 요소로 되돌아 가지 않습니다.

관련 문제