Project Euler # 5 php сомневаюсь! - PullRequest
0 голосов
/ 03 февраля 2009

проблема эйлера # 5

Я нашел решение, но я не знаю, почему этот первый код работает быстрее (я поставил 14, чтобы попытаться сделать код более понятным), единственное отличие состоит в том, что я исключаю то, что написал для огромного if

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;
}

почему этот второй код намного медленнее первого? С для это должно быть быстрее. такое же на других языках ???

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

Ответы [ 4 ]

2 голосов
/ 03 февраля 2009

Я бы пошел от наименьшего к наибольшему числу. Потому что, если число делится на 14, оно также делится на 2.

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

Этим вы можете исключить числа как можно раньше.

2 голосов
/ 03 февраля 2009

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

должно быть

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

0 голосов
/ 03 февраля 2009

Второй пример кода просто выполняет больше операций, чем первый, поэтому я ожидаю, что он будет медленнее. В этой ситуации вы обнаружите, что, несмотря на более низкую производительность, цикл for обеспечивает значительно лучшую читаемость и удобство обслуживания.

0 голосов
/ 03 февраля 2009

Я думаю, это связано с накладными расходами интерпретатора в PHP (из-за необходимости разбора и выполнения цикла for).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...