2009-02-03 7 views
0

problem euler #5Projet Euler # 5 php doute!

i trouvé la solution mais je ne sais pas pourquoi ce premier code est plus rapide (je mets 14 pour essayer de rendre plus clair le code), la seule différence est que j'éliminons le j'écrit pour un énorme si

if($num%14==0 && $num%13==0 &&$num%12==0 &&$num%11==0 &&$num%10==0 && $num%9==0 && $num%8==0 && $num%7==0 && $num%6==0 && $num%5==0 && $num%4==0 && $num%3==0 && $num%2==0 && $num%1==0){ 
    $notFound=0; 
} 

pourquoi ce deuxième code est-il beaucoup plus lent que le premier? Avec le pour, il suppose d'être plus rapide. est la même dans d'autres langues ???

$notFound=0; 
for ($i=14; $i>=2 && notFound==0; $i--){ 
    if($num%$i!=0){ 
     $notFound=1; 
    } 
} 
+0

désolé je vais corriger le poste –

+0

reverni "euler5" à "projet-euler" –

Répondre

0

Le deuxième exemple de code est qu'accomplir que la première plus d'opérations, donc je pensais que ce serait plus lent. Dans cette situation, vous constaterez que tout en offrant des performances médiocres, une boucle for offre une lisibilité et une maintenabilité nettement meilleures.

0

Je pense que cela est dû à la surcharge de l'interpréteur avec PHP (avec lui devoir analyser et exécuter la boucle for).

2

for ($i=14; $i>=2 && notFound==0; $i--){

devrait être

for ($i=14; $i>=2 && $notFound==0; $i--){

2

Je passerais du plus petit au plus grand nombre. Parce que si un nombre est divisible par 14, il est également divisible par 2.

$notFound = 0; 
for ($i=2; $i<=14; $i++) { 
    if ($num % $i !== 0) { 
     $notFound = 1; 
     break; 
    } 
} 

En faisant cela, vous pouvez exclure les numéros le plus tôt possible.

+0

Eh bien, il peut couper dans les deux sens ... il pourrait passer le test pour les plus petits nombres (2, 3, etc.) seulement à échouer le test pour les plus grands. si vous ne pouvez isoler que les facteurs premiers de 2 à 14 et tester la divisibilité avec seulement ceux-là, alors cela peut probablement être un peu plus rapide – cruizer