找到斐波纳契数列中偶数项的总和

时间:2012-01-29 13:32:40

标签: python sum fibonacci

#!/usr/bin/python2

"""
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, ...
By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.
"""

odd, even = 0,1
total = 0
while True:
    odd = odd + even  #Odd
    even = odd + even     #Even
    if even < 4000000:
        total += even
    else:
        break
print total

我的算法

  1. 如果我将前2个数字取为0,1;我在while循环中首先找到的数字将是奇数和Fibonacci系列的第一个。
  2. 这样我计算偶数,每次都将even的值加到total。
  3. 如果even的值大于4e6,我会从无限循环中断开。
  4. 我已经尝试过这么多,但我的回答总是错误的。谷歌说答案应该是4613732,但我似乎总是得到5702886

    感谢您的支持。

23 个答案:

答案 0 :(得分:19)

基本上你在这里做的是添加斐波纳契数列的每一个元素,而问题只要求偶数元素的总和。

你应该做的只是迭代4000000以下的所有斐波纳契值并做if value % 2 == 0: total += value%是除法运算符的余数,如果除以2时的余数等于0,则数字为偶数。

E.g:

prev, cur = 0, 1
total = 0
while True:
    prev, cur = cur, prev + cur
    if cur >= 4000000:
        break
    if cur % 2 == 0:
        total += cur
print(total)

答案 1 :(得分:3)

def fibonacci_iter(limit):
    a, b = 0, 1
    while a < limit:
        yield a
        a, b = b, a + b

print sum(a for a in fibonacci_iter(4e6) if not (a & 1))

答案 2 :(得分:3)

这是C中的简单解决方案:

#include <stdio.h>
#include <stdlib.h>

int main()
{
int i=1,j=1,sum=0;
    while(i<4000000)
    {
    i=i+j;
    j=i-j;
    if(i%2==0)
    sum+=i;
    }
printf("Sum is: %d",sum);

}

答案 3 :(得分:2)

您的代码包含其他所有术语,而不是偶数。要查看print even之前发生的事情total += even,您会看到奇数。您需要做的是使用模运算符检查您为均匀度添加的总数:

total = 0
x, y = 0, 1
while y < 4000000:
    x, y = y, x + y
    if x % 2:
        continue
    total += x

print total

答案 4 :(得分:1)

这是Project Euler系列中的第二个问题。

事实证明,每三个斐波纳契数都是偶数(最初零不是该系列的一部分)。因此,我从a,b,c开始为0,1,1,总和将是我迭代中每个重复出现的第一个元素。 我的变量的值将更新,每个值都是前两个值的和:
a = b + cb = c + ac = a + b

变量a将始终为偶数。这样,我可以避免检查奇偶校验。

在代码中:


def euler2():
    a, b, c, sum = 0, 1, 1, 0
    while True:
        print(a, b, c)
        a, b, c = (b + c), (2 * c + b), (2 * b + 3 * c)
        if a >= 4_000_000:
            break
        sum += a
    return sum

print(euler2())

答案 5 :(得分:1)

python3中的代码:

sum = 2
a = 1
b = 2
c = 0

while c <= 4000000:
    c = a + b
    if c%2 == 0:
        sum += c

    a,b = b,c

print(sum)

输出>>> 4613732

答案 6 :(得分:1)

def fibLessThan(lim):
    a ,b = 1,2
    total = 0
    while b<lim:
        if b%2 ==0:
            total+=b
        a,b = b,a+b
    return total

我尝试了这个完全正常的答案。我们大多数人都在我们缺少2个纤维公式之后添加数字。在我的代码中,我先添加2个然后是fib公式。这就是欧拉问题的确切答案。

答案 7 :(得分:1)

你只是误解了偶数序列甚至价值。

  

示例:1,2,3,5,8,13,21

在上面的序列中,我们需要选择 1,3,5,13,​​21 而不是 2,5,13

以下是JAVA的解决方案

 public static void main(String[] args) {
        int sum = 2;    // Starts with 1, 2: So 2 is added
        int n1=1;
        int n2=2;
        int n=0;

        while(n<4000000){
            n=n1+n2;
            n1=n2;
            n2=n;
            if(n%2==0){
                sum=sum+n;
            }
        }
        System.out.println("Sum: "+sum);
    }

输出是,

  

总和:4613732

答案 8 :(得分:0)

它应该是:

odd, even = 1,0

此外,每三个数字都是偶数(偶数+奇数+奇数=偶数)。

答案 9 :(得分:0)

第一个错误是你弄乱了斐波那契数列,从 0 和 1 开始而不是 1 和 2。因此总和应该初始化为 2

#!/usr/bin/python2
firstNum, lastNum = 1, 2
n = 0
sum = 2  # Initialize sum to 2 since 2 is already even
maxRange = input("Enter the final number")
max = int(maxRange)

while n < max:
    n = firstNum + lastNum
    firstNum = lastNum
    lastNum = n

    if n % 2 == 0:
        sum = sum + n

print(sum)

答案 10 :(得分:0)

我这样解决了:

list=[1, 2]
total =2
while total< 4000000:
    list.append(list[-1]+list[-2])
    if list[-1] % 2 ==0:
        total += list[-1]
print(total)

答案 11 :(得分:0)

如此简单的系列有太多代码。可以很容易地证明f(i + 3)= f(i-3)+ 4 * f(i),因此您可以简单地从f(0),f(3)的0,2开始,直接进行偶数步长为3,就像正常系列一样:

s,a,b = 0,0,2
while a <= 4000000: s,a,b = s+a,b,a+4*b
print(s)

答案 12 :(得分:0)

尽管很难相信一个有17个答案的问题还需要另一个,但在我看来,几乎所有以前的答案都存在问题:首先,他们使用模运算符(%)或 division 来求解附加问题;其次,他们计算序列中的 all 个数字,并将奇数扔掉;最后,其中许多程序看起来像 C 程序,几乎没有Python的优势。

由于我们知道斐波那契数列的每个第三个数字都是偶数,因此我们可以生成从2开始的每个第三个数字并求和:

def generate_even_fibonacci(limit):
    previous, current = 0, 2

    while current < limit:
        yield current

        previous, current = current, current * 4 + previous

print(sum(generate_even_fibonacci(4_000_000)))

输出

> python3 test.py
4613732
>

答案 13 :(得分:0)

这是我的Python代码:

even_sum = 0
x = [1, 1] # Fibonacci sequence starts with 1,1...

while (x [-2] + x [-1]) < 4000000: # Check if the coming number is smaller than 4 million
    if (x [-2] + x [-1]) % 2 == 0: # Check if the number is even
        even_sum += (x [-2] + x [-1])
    x.append (x [-2] + x [-1]) # Compose the Fibonacci sequence
print (even_sum)

答案 14 :(得分:0)

我做的不同。

package src.main{

    import src.tilespack.Tile;

    public class Main{

        public var tile:Tile;

        public function Main{
            var t:Tile = Tile.tiles[0]; //Error here

            trace(Tile); //This will also cause an error
        }

答案 15 :(得分:0)

以下是我能够使用原生javascript解决此问题的方法。

var sum = 0,
x = 1,
y = 2,
z = 0;
while (z < 4000000) {
    if (y%2==0){
        sum +=y;
    }
    z = x + y;
    x = y;
    y = z;
} console.log(sum);

答案 16 :(得分:0)

不确定您的问题是否已经得到解答,或者您找到了解决方案,但这就是您做错了什么。这个问题要求你找到偶数项,这意味着你需要找到斐波纳契数列中的每个值,它可以除以2而没有余数。问题不是要求您找到每个偶数索引值。以下是您的问题的解决方案,它给出了正确的答案:

i = 1
total = 0
t = fib(i)
while t <= 4000000:
    t = fib(i)
    if t % 2 == 0:
        total += t
    i += 1
print total

基本上你遍历斐波那契序列中的每一个值,通过使用'mod'(%运算符)来得到余数来检查值是否均匀,然后如果它甚至是你将它加到总和中。

答案 17 :(得分:0)

Fibonnaci序列中的每个 3rd 项都是偶数。所以,你可以这样:

prev, cur = 0, 1
count = 1
total = 0
while True:
    prev, cur = cur, prev + cur
    count = count + 1
    if cur >= 4000000:
        break
    if count % 3 == 0:
        total += cur
print(total)

或者(尽可能少地更改代码):

even, odd = 0,1                       # this line was corrected
total = 0
while True:
    secondOdd = even + odd                   # this line was changed
    even = odd + secondOdd     #Even         # this line was changed
    if even < 4000000:
        total += even
        odd = secondOdd + even               # this line was added
    else:
        break
print total

另一种方法是(通过使用一些简单的数学运算)来检查a2+a5+a8+a11+...+a(3N+2)(偶数Fibonacci值之和)的总和是否等于(a(3N+4)-1)/2。因此,如果您可以直接计算该数字,则无需计算所有先前的斐波纳契数。

答案 18 :(得分:0)

其他答案是正确的,但请注意,只需添加数组中的所有偶数,就行了 myarray = [1,2,3,5,8,13,21,34,55,89]

sum(map(lambda k:k if k%2 else 0, myarray))

sum([k if k%2 else 0 for k in [1,2,3,4,5]])

答案 19 :(得分:0)

如果你添加斐波纳契数列的每一个值,你将获得最后一个加值后的下一个斐波纳契值。例如:

f(0) + f(2) + f(4) = f(5)
0 + 1 + 3 + 8 = 13

但您的代码目前不会添加第一个偶数值1

答案 20 :(得分:-1)

这是python实现并且运行良好。

from math import pow
sum=0
summation=0
first,second=1,2
summation+=second
print first,second,
while sum < 4*math.pow(10,6):
     sum=first+second
     first=second
     second=sum
     #i+=1
     if sum > 4*math.pow(10,6):
        break
     elif sum%2==0:
        summation+=sum
print "The final summation is %d" %(summation)

答案 21 :(得分:-1)

代码中的

问题基本上与循环样式和检查条件时序有关。使用java编码的下面的算法你可以找到(第二个+第一个)&lt; 4000000条件检查,它带给你正确的(少于4000000)结果,有一个很好的编码......

   int first = 0, second = 1, pivot = 0;

    do {

        if ((second + first) < 4000000) { // this is the point which makes your solution correct
          pivot = second + first;
          first = second;
          second = pivot;
          System.out.println(pivot);
        } else {
            break;
        }


    } while (true);

答案 22 :(得分:-1)

        long sum = 2;
        int start = 1;
        int second = 2;
        int newValue = 0;
        do{
            newValue = start + second;
            if (newValue % 2 == 0) {
                sum += newValue;
            }
            start = second;
            second = newValue;
        } while (newValue < 4000000);
        System.out.println("Finding the totoal sum of :" + (sum));`enter code here`