2016-05-10 11 views
2

あなたの中にはProjectEulerをよく知っている人もいます。コードの使用によって解決できる一連のロジスティックナンバーベースのパズルを含むウェブサイト/コミュニティです。 彼らは私が解決策C#fibbonacci numbers

int firstNumber = 0; 
    int Total = 0; 
    for (int fib = 0; fib < 4000000; fib+=firstNumber) 
    { 
      firstNumber += fib; 
      if (fib % 2 == 0) 
      { 
      total += fib 
      } 
    } 

として、次のコードを生成 「偶数値の項の和を見つけ、値400万を超えていないフィボナッチ数列の項を考慮することにより、」質問の読書を持っていますしかし、私が試したIDEはこれを実行できませんでした。私はプログラミングには全く新しいので、学校でやっているコースはオブジェクト指向のプログラミングで直接始まりますので、コンピュータ科学のバックグラウンドはあまりありません。あなたが見ることができるように、理論的に私が提供したコードは、前の値に増分を変更し、フィボナッチシーケンスを作成し、合計にそれぞれの偶数を追加すると答えが得られるはずです。 Logisticallyそれは適切だと思われるが、私はソフトウェアエンジニアから遠いので、私は何をしているのか分からない。 私の質問は、私のコードではどういうことが間違っているのでしょうか?問題の解決にどのようにアプローチするのでしょうか?ありがとう、アダム。

+0

でそれを解決することができます「... 1は、コードの*を使用して解決することができロジスティック数ベースのパズルのシリーズ*」プロジェクト・オイラーは約数学についての詳細ですプログラミング(しかしそれは役に立つかもしれない)。この問題を解決するためのプログラムは必要ありません。 –

答えて

2

解決策には2つの問題があります。最初に両方の用語を0から開始し、0から0を追加すると0になります。両方で1から始める必要があります。第二に、あなたの現在の用語がfibfirstNumberの間で交互になっているという事実です。両方の合計を置くために一時的な値が必要な場合は、firstNubmerからfibに、次にfibを一時的な値に設定します。だから、実際にはwhileループを代わりに使うことができます。

int firstNumber = 1; 
int fib = 1; 
int Total = 0; 
while(fib < 4000000) 
{ 
    if (fib % 2 == 0) 
    { 
     total += fib; 
    } 

    int temp = firstNumber + fib; 
    firstNumber = fib; 
    fib = temp; 
} 

しかし、ここで私は同じ問題を解決しました。これは、他のオイラー問題に再利用できる方法を示しています。また、一時変数を使用する代わりに、前の項を現在の値に加算して次の値を取り、次に前の値を現在の値から減算すると、currentの値が前に加算されます。

public static IEnumerable<long> FibSeries() 
{ 
    yield return 1; 
    long previous = 1; 
    long current = 1; 
    while (true) 
    { 
     yield return current; 
     current += previous; 
     previous = current - previous; 
    } 
} 

そして、あなたは、LINQの

long sum = FibSeries().TakeWhile(f => f < 4000000).Where(f => f % 2 == 0).Sum();