项目欧拉 - 2号 - C#

时间:2011-11-03 18:08:18

标签: c# math

我对使用C#进行编程非常陌生,并认为尝试欧拉问题作为一个起点基础是一个好主意。但是,我已经达到了一个问题,我似乎无法得到问题2的正确答案。

“Fibonacci序列中的每个新术语都是通过添加前两个术语生成的。从1和2开始,前10个术语将是:

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

通过考虑Fibonacci序列中的值不超过四百万的项,找到偶数项的总和。“

我的代码是:

int i = 1;
int j = 2;
int sum = 0;

while (i < 4000000) 
{
     if (i < j)
     {
         i += j;

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

     }

     else
     {
         j += i;

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

MessageBox.Show("The answer is " + sum);

基本上,我认为我只获得序列的最后两个偶数并添加它们 - 但我不知道如何获得序列的所有偶数并添加它们。有人可以帮助我,同时试图从我的起点进步吗?

P.S。 - 如果有任何非常糟糕的布局选择,请说现在消除这些将有助于我在未来成为更好的程序员:)

提前多多感谢。

8 个答案:

答案 0 :(得分:2)

使用数组fib存储序列。它更容易编码和调试。在每次迭代时,您只需要检查值是否均匀。

fib[i] = fib[i - 1] + fib[i - 2];
if (fib[i] > 4000000) break;
if (fib[i] % 2 == 0) sum += fib[i];

答案 1 :(得分:2)

您需要将sum的初始值设置为2,因为您不包括与当前代码的总和中的值。

此外,尽管内存使用效率可能较低,但我可能会编写类似这样的代码,因为IMO更具可读性:

var fibonacci = new List<int>();

fibonacci.Add(1);
fibonacci.Add(2);

var curIndex = 1;

while(fibonacci[curIndex] + fibonacci[curIndex - 1] <= 4000000) {
    fibonacci.Add(fibonacci[curIndex] + fibonacci[curIndex - 1]);
    curIndex++;
}

var sum = fibonacci.Where(x => x % 2 == 0).Sum();

答案 2 :(得分:2)

我刚刚登录我的Project Euler帐户,看到了正确的答案。正如其他人所说,你忘记添加初始术语2,但是否则你的代码没问题(正确的答案是你的代码输出+ 2),做得好!

但这很令人困惑,我认为如果你使用3个变量会更加清晰,例如:

int first = 1;
int second = 1;
int newTerm = 0;
int sum = 0;

while (newTerm <= 4000000) 
{
    newTerm = first + second;

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

    first = second;
    second = newTerm;
}

MessageBox.Show("The answer is " + sum);

答案 3 :(得分:0)

几年前我已经解决了这个问题,所以我不记得我是怎么做到的,但我确实可以访问论坛来讨论它。一些提示和一个彻头彻尾的解决方案。数字以一种模式重复。偶然的两个几率。所以你可以跳过数字而不必进行模数运算。

建议的C#解决方案是

        long sum = 0, i0, i1 = 1, i2 = 2;
        do
        {
            sum += i2;
            for (int i = 0; i < 3; i++)
            {
                i0 = i1;
                i1 = i2;
                i2 = i1 + i0;
            }
        } while (i2 < 4000000);

答案 4 :(得分:0)

你的代码有点难看,因为你在i和j之间交替。有一种更简单的方法可以通过使用三个变量来计算斐波纳契数,并始终保持其含义相同。

一个相关的错误是你只检查每一次迭代和错误位置的结束条件。但是你很幸运,截止值适合你的bug(超过极限的数字很奇怪),所以这不是你的问题。

另一个错误是您使用<而不是<=进行检查,但由于没有等于截止值的斐波纳契数,这不会导致您的问题。

它也不是int溢出。

剩下的是你忘了查看序列的前两个元素。其中只有一个是偶数,因此您需要在结果中添加2

int sum = 0; => int sum = 2;

就个人而言,我会编写一个返回无限fibonacci序列的函数,然后用Linq过滤和求和。 Fibonacci().TakeWhile(i=> i<=4000000).Where(i=>i%2==0).Sum()

答案 5 :(得分:0)

我使用一个类来表示FibonacciNumber,我认为这使得代码更具可读性。

public class FibonacciNumber
{
    private readonly int first;
    private readonly int second;

    public FibonacciNumber()
    {
        this.first = 0;
        this.second = 1;
    }

    private FibonacciNumber(int first, int second)
    {
        this.first = first;
        this.second = second;
    }

    public int Number
    {
        get { return first + second; }
    }

    public FibonacciNumber Next
    {
        get
        {
            return new FibonacciNumber(this.second, this.Number);
        }
    }

    public bool IsMultipleOf2
    {
        get { return (this.Number % 2 == 0); }
    }
}

也许这是一个太过分的步骤,但最终结果是一个功能,读得相当不错恕我直言:

var current = new FibonacciNumber();
var result = 0;
while (current.Number <= max)
{
    if (current.IsMultipleOf2)
        result += current.Number;

    current = current.Next;
}
return result;

然而,它不会像其他解决方案那样有效,而不是在while循环中新建类。取决于你的要求我想,对我来说,我只是想解决问题并转到下一个。

答案 6 :(得分:0)

您好我已经解决了这个问题,检查一下是否正确。 我的代码是,

          #include<iostream.h>
          #include<conio.h>
          class euler2
            {
              unsigned long long int a;
             public:
            void evensum();
            };
         void euler2::evensum()
          {
             a=4000000;
             unsigned  long long int i;
             unsigned long long int u;

             unsigned long long int initial=0;
             unsigned long long  int initial1=1;
             unsigned long long int sum=0;
          for(i=1;i<=a;i++)
             {
                  u=initial+initial1;
                  initial=initial1;
                  initial1=u;
                if(u%2==0)
                   {

                 sum=sum+u;
                    }
               }
           cout<<"sum of even fibonacci numbers upto 400000 is"<<sum;
         }

             void main()
                 {
                    euler2 a;
                    clrscr();
                    a.evensum();
                    getch();
                  }

答案 7 :(得分:0)

这是我的实施:

public static int evenFibonachi(int n)
        {
            int EvenSum = 2, firstElem = 1, SecondElem = 2, SumElem=0;

            while (SumElem <= n)
            {
                swich(ref firstElem, ref SecondElem, ref SumElem);
                if (SumElem % 2 == 0)
                    EvenSum += SumElem;
            }

            return EvenSum;
        }

        private static void swich(ref int firstElem, ref int secondElem, ref int SumElem)
        {
            int temp = firstElem;
            firstElem = secondElem;
            secondElem += temp;
            SumElem = firstElem + secondElem;
        }