PHP项目Euler#2解决方案

时间:2012-02-19 11:17:56

标签: php numbers

我得到了解决方案;但是,我觉得代码非常糟糕。这是在我使用任何编程语言的前50个小时内...请耐心等待。

问题:

Fibonacci序列中的每个新术语都是通过添加前两个术语生成的。从1和2开始,前10个术语将是: 1,2,3,5,8,13,21,34,55,89 ...... 通过考虑Fibonacci序列中的值不超过四百万的项,找到偶数项的总和。

我的解决方案:

<?php

//if number is odd, returns false
function setOddsZero($n) {
    $test = ($n&1); //0 = even, 1 = odd
    if($test == 1) {
        return false;
    } else {
        $n = $n;
    }
}


$numbers=array(1,);
for($i>0; $i<=100; $i++) {
$numbers[$i] += (($numbers[$i-2])+($numbers[$i-1]));
  if (($numbers[$i]) >= 4000000) {
      echo $total;
      die;
  } else {
      if((setOddsZero($numbers[$i]))===false) {
          $total += 0;
      }else {
          $total += $numbers[$i];
      }
  }
}
?>

4 个答案:

答案 0 :(得分:3)

这是我使用for循环的解决方案:

$a = 0;
$b = 1;
$p = 0;
$limit = 4000000;

for($i=0; $p < $limit; $i++) {
    $sum = $a+$b;
    $a = $b;
    $b = $sum;

    // Checks if $a is a multiple of 2
    if($a%2 == 0) {
        $p += $a;
    }
}
echo $p;

答案 1 :(得分:2)

无需记住所有数字。

$num0 = 1;
$num1 = 1;
$num2 = 0;
$odd = 0;
do
{
    //The way you count recurents in cycles
    $num2 = $num1 + $num0;

    $num0 = $num1;
    $num1 = $num2;

    //Classic check wheter the number is odd o even
    if($num2 % 2 == 1)
        $odd++;
} while($num2 < 4000000);

答案 2 :(得分:1)

$fibos = array(1,2);
$sum_of_evens = 0;

while ($fibos[1] < 4000000)
{
    $fibos []= array_shift($fibos) + $fibos[0];
    $sum_of_evens += ($fibos[1] & 1 == 0) ? $fibos[1] : 0;
}

echo $sum_of_evens;

meze所建议的 pushy-shify(从而更有效率)方法更少:

$prevprev = 1;
$prev = 2;
$sum_of_evens = 0;

while ($prev < 4000000)
{
    list($prevprev, $prev) = array($prev, ($prevprev + $prev));
    $sum_of_evens += ($prev & 1 == 0) ? $prev : 0;
}

编辑:修改代码以使用& 1代替% 2,参见this thread at devshed

答案 3 :(得分:-4)

PHP是一种设计糟糕的语言。我想你正在学习它,因为你想从事服务器端的网络编程。请查看rails和django。