2013-06-17 3 views
1

PHP로 프로젝트의 오일러 문제 12 번을 해결하려고하는데 처리하는 데 너무 많은 시간이 걸립니다. 이전 문제를 해결하는 동안 PHP의 비슷한 처리 문제가 발생했습니다. C++로 해결해야만했습니다. 내 접근 방식이 올바른지 여부를 테스트하는 것입니다. 내 접근 방식에 문제가 있는지 또는 처리 속도를 높이기 위해 뭔가를 할 수 있는지 알고 싶습니다. 다음은 360의 제수가있는 삼각형에서 잘 작동하는 솔루션의 코드입니다. 문제의 링크는 http://projecteuler.net/problem=12이고 여기에 내 코드가 있습니다PHP로 나누어 진 삼각형 수를 계산

<?php 
    set_time_limit(0); 
    ini_set('memory_limit', '1G'); 

    $triangles = array(0); 
    $count = 1; 
    $numOfDivisiors = 0; 
    $lastTriangle = 0; 

    while($numOfDivisiors < 500){ 
     $triangle = (int) $lastTriangle + (int) $count; 
     $factors = getFactors($triangle); 
     //$triangles[] = array('triangle' => $triangle, 'factors' => $factors, 'factorsCount' => count($factors)); 
     $triangles[] = array('triangle' => $triangle, 'factorsCount' => count($factors)); 

     $lastTriangle = $triangle; 
     $numOfDivisiors = count($factors); 
     $count++; 
     //echo '<pre>'; print_r(array('triangle' => $triangle, 'factorsCount' => count($factors), 'count' => $count)); echo '</pre>'; 
    } 

    echo $numOfDivisiors; exit; 

    /** 
    for($i = 0 ; $i < 10 ; $i++){ 

    } 
    **/ 
    //echo '<pre>'; print_r($triangles); exit; 

    function getFactors($number){ 
     $factors = array(); 
     $break = false; 
     $count = 1; 
     while($break != true){ 
      $remainder = $number % $count; 
      if($remainder == 0){ 
       $factors[] = $count; 
      } 
      //echo $count." ".$number; exit; 
      if($count == $number){ 
       $break = true; 
      } 
      $count++; 
     } 
     return $factors; 
    } 
?> 

답변

1

사용하는 일부 수학 속도를 도움이 될 것입니다.

삼각형 번호는

N (N + 1)/2

에 의해 생성하고 자신의 능력에 1을 추가하고 함께 곱, 주요 요인을 찾을 수 있다면 것을 약수의 수를 제공 할 수 있습니다.

내 PHP 솔루션은 약 4 초 정도 걸립니다 그리고 내가 또한

+0

필자가 일부 변경 한 지금이 답변을하시기 바랍니다 정교한 PHP – exussum

+0

에 두 번째의 분기에 실행하는 속도를 높일 수 있다고 생각합니다. 특히 '그리고 만약 당신이 소수 요소를 발견 할 수 있다면, ** 그들의 힘에 1을 더하고 함께 곱하면 제수가 나온다. ** – fyz

+0

@feed_me_code 이것은 내가 할 수있는 것보다 더 잘 설명한다 http://www.wikihow.com/ 찾기 쉬운 방법 - 많은 요소 -All-in-a-Number – exussum

0

솔루션 속도를 높이는 방법에는 여러 가지가 있습니다.

a와 b가

중 하나와 B C의 요인 모두가 < 될 것입니다 후 * B = C를 경우 =에 : 나는 당신을 가리키는 것 첫 번째는 다음과 같다

이 C

의 제곱근은 솔루션

관련 문제