2010-11-07 65 views
1

我試圖解決上項目歐拉的第二個問題,現在的問題是:C#Fibonacci序列複製

在Fibonacci序列中的每個新名詞是通過將前兩個方面產生。通過用1和2開始,第一10項將是:

1,2,3,5,8,13,21,34,55,89,...

找到所有的總和序列中的偶數值不超過四百萬。

所以,我已經設置了以下內容:

using System; 

namespace ProjectEuler 
{ 
    class Question2 
    { 
     //Project Euler - Question 2 
     //Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be: 
     //1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... 
     //Find the sum of all the even-valued terms in the sequence which do not exceed four million 
     static void Main() 
     { 
      int sum = 0; 

      int oldNumber = 1; 
      int currentNumber = 1; 
      int nextNumber; 

      while (currentNumber <= 500) 
      { 
       nextNumber = currentNumber + oldNumber; 

       if (nextNumber % 2 == 0) 
       { 
        sum += currentNumber; 
       } 
      } 

      Console.WriteLine("Project Euler - Question 2\n\nAnswer: " + sum); 
      Console.ReadLine(); 
     } 
    } 
} 

當我運行程序,沒有什麼可見的,只需在Windows命令行的光標。我認爲這可能是因爲currentNumber沒有得到更新的事實,但我想不出如何正確地做到這一點,即使是這樣的情況。

回答

4

您沒有條件結束循環。你永遠不currentNumber的值更改爲任何東西,但1

你可能想是這樣的:

nextNumber = currentNumber + oldNumber; 
oldNumber = currentNumber; 
currentNumber = nextNumber; 
1

不,它沒有被更新,和你有一個無限循環。

思考Fibbonacci序列的更簡單的方法是,下一個值是前兩個值的總和。

即,

0 1。接着是1 接下來是2(1 + 1) 接下來是3(1 + 2) 接下來是5(2 + 5)

因此,保持最後兩個值的軌道,並用它來創建下一個值。

3

你說得對,問題是因爲currentNumber從不更新。再看看斐波那契序列:

F(n+2) = F(n+1) + F(n) 
     ^currentNumber 
^ nextNumber ^oldNumber 

而且在下一次迭代:

F(n+3) = F(n+2) + F(n+1) 
     ^currentNumber 
^ nextNumber ^oldNumber 

注意,變量移動一個位置在右邊和最古老的號碼將被丟棄。所以,你需要做這樣的事情:

nextNumber = currentNumber + oldNumber; 
oldNumber = currentNumber; 
currentNumber = nextNumber; 
2
using System; 

namespace ProjectEuler 
{ 
    class Question2 
    { 
     //Project Euler - Question 2 
     //Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be: 
     //1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... 
     //Find the sum of all the even-valued terms in the sequence which do not exceed four million 
     static void Main() 
     { 
      int sum = 0; 

      int currentNumber = 1; 
     int lastNumber = 0; 

      while (currentNumber <= 500) 
      { 
       if (currentNumber % 2 == 0) 
       { 
        sum += currentNumber; 
       } 

     int nextNumber = lastNumber + currentNumber; 
     lastNumber = currentNumber; 
     currentNumber = nextNumber; 
      } 

      Console.WriteLine("Project Euler - Question 2\n\nAnswer: " + sum); 
      Console.ReadLine(); 
     } 
    } 
} 
2
static void Main(string[] args) 
     { 
      var sum = 0; 
      foreach (var number in GetEvenFibonacciSeries()) 
      { 
       if (sum + number > 4000000) 
        break; 

       sum += number; 
      } 

      Console.WriteLine(sum); 
     } 

     private static IEnumerable<int> GetEvenFibonacciSeries() 
     { 
      var first = 0; 
      var second = 1; 
      var next = 0; 
      while (true) 
      { 
       next = first + second; 
       first = second; 
       second = next; 
       if(next % 2 == 0) 
        yield return next; 
      } 
     }