Нахождение суммы четных членов в последовательности Фибоначчи - PullRequest
6 голосов
/ 29 января 2012
#!/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, будет нечетным числом и первым из ряда Фибоначчи.
  2. Таким образом, я вычисляю четное число и каждый раз добавляю значение четного к итоговому.
  3. Если значение even больше 4e6, я вырываюсь из бесконечного цикла.

Я так старался, но мой ответ всегда неверен. Гугл говорит, что ответ должен быть 4613732, но я всегда получаю 5702886

Спасибо за поддержку.

Ответы [ 16 ]

20 голосов
/ 29 января 2012

По сути, здесь вы добавляете каждый второй элемент последовательности Фибоначчи, в то время как вопрос требует суммировать только четные элементы.

Вместо этого вам нужно просто выполнить итерацию по всем значениям Фибоначчи, указанным ниже4000000 и сделать if value % 2 == 0: total += value.% - это остаток от оператора деления, если остаток при делении на 2 равен 0, то число является четным.

Например:

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)
3 голосов
/ 21 января 2013

Вот простое решение в 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 голосов
/ 29 января 2012
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 голосов
/ 29 января 2012

Ваш код включает все остальные термины, а не четные значения .Чтобы увидеть, что происходит, 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
1 голос
/ 18 мая 2018
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

Я попробовал этот точно рабочий ответ. Большинство из нас добавляют число после формулы FIB, где нам не хватает 2. С моим кодом я сначала добавляю 2, а затем формулу FIB Вот какой именно ответ на проблему Эйлера.

1 голос
/ 13 декабря 2017

Вы просто неправильно поняли четную последовательность и четное значение.

Пример: 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

0 голосов
/ 18 декабря 2017

Вот мой код 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)
0 голосов
/ 29 ноября 2015

Я сделал это по-другому.

def fibLessThan(lim):

    #################
    # Initial Setup #
    #################
    fibArray=[1, 1, 2]
    i=3


    #####################
    # While loop begins #
    #####################
    while True:
        tempNum = fibArray[i-2]+fibArray[i-1]
        if tempNum <= lim:
            fibArray.append(tempNum)
            i += 1
        else: 
            break

    print fibArray
    return fibArray 


limit =  4000000
fibList = fibLessThan(limit) 


#############
# summation #
#############
evenNum = [x for x in fibList if x%2==0]
evenSum = sum(evenNum)
print "evensum=", evenSum
0 голосов
/ 26 ноября 2014

Это реализация 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)
0 голосов
/ 30 октября 2014

Вот как мне удалось решить эту проблему с помощью нативного 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);
...