甚至斐波纳契数的总和

时间:2010-04-04 14:04:19

标签: c# fibonacci

这是项目欧拉问题。如果您不希望看到候选解决方案,请不要在此处查看。

大家好!我正在开发一个应用程序,它将找到斐波那契序列的所有偶数项的总和。该序列的最后一项是4,000,000。我的代码有问题,但我找不到问题,因为它对我有意义。你能帮我吗?

using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
           long[] arr = new long [1000000] ;
           long i= 2;
           arr[i-2]=1;
           arr[i-1]=2;
           long n= arr[i];

           long s=0;
            for (i=2 ; n <= 4000000; i++)
            {                    
                arr[i] = arr[(i - 1)] + arr[(i - 2)];
            }
            for (long f = 0; f <= arr.Length - 1; f++)
            {
                if (arr[f] % 2 == 0)
                    s += arr[f];
            }
            Console.Write(s);
            Console.Read();                
        }
    }
}

5 个答案:

答案 0 :(得分:3)

使用此:http://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression

第三身份 该身份对于Fj具有略微不同的形式,这取决于j是奇数还是偶数。 第一个n - 1个斐波那契数Fj的总和,即j是奇数,是第(2n)个斐波纳契数。

前n个斐波那契数Fj的总和,即j是偶数,是第(2n + 1)个斐波那契数减1。

[16]

唯一的问题是当你将phi提高到(2n + 1)次幂时可能会失去精确度。

答案 1 :(得分:2)

在本节中:

       long n= arr[i];

       long s=0;
        for (i=2 ; n <= 4000000; i++)
        {

            arr[i] = arr[(i - 1)] + arr[(i - 2)];
        }

您只分配了n一次; n永远不会更新,因此您的循环永远不会终止。

n 未绑定i; n设置为arr[2],因为此时i为2。因此,i将永远是循环的第一次迭代中的3。

要解决这个问题,一种方法是完全摆脱n并使你的循环条件

for (i = 2; arr[i] <= 4000000; i++)

答案 2 :(得分:1)

将第一个for循环更改为:

for (i = 2; arr[i - 1] < 4000000; i++)

答案 3 :(得分:1)

试试这个(并将其用于您的大整数要求:http://intx.codeplex.com/Wikipage):

using System;
using System.Collections;
using System.Linq;
using System.Collections.Generic;

using Oyster.Math;

namespace Application
{


public class Test
{

    public static void Main()
    {    
        IntX even = 0;
        Console.WriteLine("Sum of even fibonacci {0}\n", 
            Fibonacci(20).Where(x => x % 2 == 0).Sum());
        Console.WriteLine("Sum of odd fibonacci {0}", 
            Fibonacci(20).Where(x => x % 2 == 1).Sum());

        Console.Write("\nFibonacci samples");
        foreach (IntX i in Fibonacci(20))
            Console.Write(" {0}", i);

        Console.ReadLine();

    }

    public static IEnumerable<IntX> Fibonacci(int range)
    {
        int i = 0;

        IntX very = 0;       
        yield return very;
        ++i;

        IntX old = 1;       
        yield return old;
        ++i;

        IntX fib = 0; 
        while (i < range)
        {
            fib = very + old;
            yield return fib;
            ++i;

            very = old;
            old = fib;                
        }

    }
}


public static class Helper
{
    public static IntX Sum(this IEnumerable<IntX> v)
    {
        int s = 0;
        foreach (int i in v) s += i;
        return s;
    }
}

}

示例输出:

Sum of even fibonacci 3382

Sum of odd fibonacci 7563

Fibonacci samples 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181

答案 4 :(得分:1)

我承认我会完全不同地做到这一点。我可能会使用Lucas和Fibonacci数的配对序列,加上简单的公式

F(n + a)=(F(a)* L(n)+ L(a)* F(n))/ 2

L(n + a)=(5 * F(a)* F(n)+ L(a)* L(n))/ 2

请注意,只有每三个Fibonacci数是偶数。因此,由于F(3)= 2,L(3)= 4,我们得到

F(n + 3)= L(n)+ 2 * F(n)

L(n + 3)= 5 * F(n)+ 2 * L(n)

现在只是总结条款。

(编辑:有一个更简单的解决方案,这确实依赖于一些数学上的复杂性来推导,或者对该序列的Fibonacci序列和身份的一些了解,或者可能通过整数序列的百科全书进行搜索。 ,除了这个提示似乎不适合PE问题,所以我将把这个解决方案留在本说明的边缘。因此,第一个k甚至Fibonacci数的总和是......)