문제

다른 프로젝트에 최근 오일러 질문을하지만 내 생각이 조금 더 특정(나만 정말에 관심있는 PHP 기반 솔루션이)그래서 나는 어쨌든.

문제#5 과 작업을:"무엇이 가장 작은 수로는 균일하게 나눌에 의해 번호를 모두 1 에서 20?"

지금,나는 그것을 해결했다.면 매우 비효율적으로 그리고 한 번은 훨씬 더 효율적으로 하지만 나는 아직도 멀리서 특히 정교한 대답(그리고 나는 특히 단단한 수학에서 그러므로 나의 무력을 솔루션).내가 볼 수있는 몇 가지 분야의할 수 있는 개선이 있지만 내가 궁금하는 경우 당신을 보여줄 수 있는 더 효율적으로 이 문제를 해결할 수 있습니다.

*스포일러:여기에는 나보다 적게 최적의(7 초을 실행하는)하지만 여전히 허용 솔루션(무엇을 해야할지에 대한 더블$...다만 가장 당신이 볼 1...

    function euler5(){
        $x = 20;

        for ($y = 1; $y < 20; $y++) {

            if (!($x%$y)) {

            } else {  
                $x+=20;
                $y = 1;  
            }   

        }echo $x;
     };
도움이 되었습니까?

해결책

PHP에서는 다음과 같습니다.

<?php
function gcd($a,$b) {
    while($a>0 && $b>0) {
        if($a>$b) $a=$a-$b; else $b=$b-$a;        
    }
    if($a==0) return $b;
    return $a;
}
function euler5($i=20) {
    $euler=$x=1;
    while($x++<$i) {
        $euler*=$x/gcd($euler,$x);
    }
    return $euler;
}

?>

당신이 게시 한 것보다 적어도 두 배나 빠릅니다.

다른 팁

1과 20 사이의 모든 숫자에 대한 주요 요인을 수집합니다. 각 주요 요인의 최대 지수를 계산하십시오. 16 = 2**4, 9 = 3**2, 5, 7, 11, 13, 17, 19 (각각은 한 번만 나타납니다). 많은 것을 곱하면 대답이 있습니다.

Chris Jester-Young이 맞습니다.

일반적으로 1에서 n까지의 모든 숫자로 균등하게 나눌 수있는 가장 작은 숫자를 원한다면 2에서 n까지의 모든 소수를 찾고 각각에 대해 가장 큰 숫자를 찾으십시오. 범위의 숫자. 이것은 N보다 크지 않은 프라임의 가장 큰 힘을 찾아 계산할 수 있습니다.

20의 경우, Chris가 지적했듯이, 2^4는 20보다 큰 2의 가장 큰 힘이며, 3^2는 20보다 큰 3의 가장 큰 힘이며, 다른 모든 프라임의 경우, 첫 번째 전력 만 20보다 크지 않습니다.

예를 들어 1으로 나뉘어 진 일부 숫자를 제거 할 수 있습니다. 예를 들어 1은 불필요하고 모든 자연 숫자는 1으로 나눌 수 있습니다. 2가 필요하지 않으므로 모든 숫자는 2 (4, 8, 16,, 배수로 나눌 수 있습니다. 등)도 2로 나눌 수 있습니다. 따라서 관련 숫자는 11, 12, 13, 14, 15, 16, 17, 18 및 19입니다.

그래서:

<?
function eulerPuzzle()
{
  $integers = array( 11,12,13,14,15,16,17,18,19 );

  for ($n = 20; 1; $n += 20 ) {
    foreach ($integers as $int) { 
      if ( $n % $int ) { 
    break; 
      }
      if ( $int == 19 ) { 
    die ("Result:" . $n); 
      }
    }
  }
}

eulerPuzzle();
?>
<?php
$i=20;
while ($i+=20) {
    for ($j=19;$j!==10;--$j){
        if ($i%$j) continue 2;
    }
    die ("result: $i\n");
}

지금까지 가장 빠르고 가장 짧은 PHP 솔루션입니다. 내 Comp에서 Czimi보다 약 1.4 배 빠릅니다. 그러나 파이썬 솔루션을 확인하십시오. 좋은 알고리입니다.

어떤 사람들은 정말로 이것을 지나치게 생각합니다 ...

루비에서 :

puts 5*7*9*11*13*16*17*19

간단한 수학을하는 사람; 그것이 운동의 목표인지 확실하지 않습니다. 당신은 새로운 언어와 물건을 수행하는 새로운 방법을 배워야합니다. 계산기로 그것을하는 것만으로도 올바른 일이 아닙니다.

그리고 나는 이것이 오래된 오래된 스레드의 게시물이라는 것을 알고 있지만 여전히 Google 결과에서 나옵니다 :)

코드 (PHP)에서 수행하는 것은 이것이 가장 빠른 해결책이라는 것을 알았습니다.

function eulerPuzzle() {
    $integers = array (11, 12, 13, 14, 15, 16, 17, 18, 19 );

    for($n = 2520; 1; $n += 2520) {
        foreach ( $integers as $int ) {
            if ($n % $int) {
                break;
            }
            if ($int == 19) {
                die ( "Result:" . $n );
            }
        }
    }
}

eulerPuzzle ();

예, CMS에서 수정 된 조각입니다. 더 빠른 주된 이유는 질문을 읽을 때 이미 처음 10 개 정수의 가능한 최저 수가 2520이라는 점을 명시했기 때문입니다. 따라서 20 대신 2520으로 증가 할 수 있습니다.

난 당신이 말한 PHP 지만,여기에 내 초고 Python.

#!/usr/bin/env python

from operator import mul

def factor(n):
    factors = {}
    i = 2
    while i < n and n != 1:
        while n % i == 0:
            try:
                factors[i] += 1
            except KeyError:
                factors[i] = 1
            n = n / i
        i += 1
    if n != 1:
        factors[n] = 1
    return factors

base = {}
for i in range(2, 2000):
    for f, n in factor(i).items():
        try:
            base[f] = max(base[f], n)
        except KeyError:
            base[f] = n

print reduce(mul, [f**n for f, n in base.items()], 1)

그것은 없으로아로 내가 만들 수 있지만,그것은 그것을 계산하는 적어도 일반적인 여러 개의 번호에서 2~2000 습니다.15s.하는 경우 반복적인 솔루션을 처리할 수 있 억 후보 초당,그것은 10^849 년을 마무리합니다.

다시 말해서,귀찮게 하지 않 최적화하는 잘못 알고리즘이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top