@Primer

Проект Эйлера. Задача №2. Как решить правильно?

Не судите строго пожалуйста, я начинающий в этой в сфере.
Пытался написать сам код, но как то не очень получается. пытался искать в инете, но там команды, которые я не очень понимаю (и как то их пояснения я тоже не очень понял). Если вам не очень трудно, то я вас прошу объяснить детально этот код:5e60f962704af092407593.png

Задача звучит так:
Каждый следующий элемент ряда Фибоначчи получается при сложении двух предыдущих.
Начиная с 1 и 2, первые 10 элементов будут
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
Найдите сумму всех четных элементов ряда Фибоначчи, которые не превышают четыре миллиона.
  • Вопрос задан
  • 10265 просмотров
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
ВНИМАНИЕ! Это неправильное решение!
Это сумма четных по счету элементов ряда фиббоначчи.
a = 1
b = 2
s = b
while b < 4*10**6:
    a = a + b
    b = a + b
    s += b

print(s)

А если четные (по значению) элементы складывать, то нужно так:
s, a, b = 0, 1, 2
while b < 4*10**6:
    if b % 2 == 0:
        s += b
    a, b = b, a + b   

print(s)

А ваше решение из вопроса неэффективно. Оно сначала строит список из всех элементов ряда, не превышающих заданного. Потом фильтрует их по четности, благо лениво и не требуется лишней памяти. Ну и суммирует фильтрат. Итого у этого алгоритма O(2*N) сложность по памяти и по столько же по операциям.
Предложенный выше алгоритм -- O(1) по памяти и O(N) по операциям.

И на старуху бывает проруха. Ага. невнимательность.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 10
@MrCryzeese
ПРАВИЛЬНОЕ РЕШЕНИЕ
fib = [1, 2]
sum = 2

while True:
    fib.append(fib[-1] + fib[-2])

    if fib[-1] > 4000000:
        break
    
    if fib[-1] % 2 == 0:
        sum += fib[-1]

print(sum)
Ответ написан
Комментировать
FoxCloud
@FoxCloud
Хостинг и облачные сервисы
a, b = 1, 1
total = 0
while a <= 4000000:
if a % 2 == 0:
total += a
a, b = b, a+b # the real formula for Fibonacci sequence
print total
Ответ написан
Комментировать
@Abigale_Vult
Пошаговый код с подробным объяснением.
Разумеется, сам ряд Фибоначчи можно убрать из кода, а также вывод самих рядов.
a = 1                   # задаем первые значения чисел Фибоначчи
b = 2
fibo = [1,2]            # создаем массив чисел Фибоначчи
fibo2 = []              # создаем массив четных чисел фибоначчи

while b < 4*10**6:
    if a % 2 == 0:      # заполняем массив четных чисел фибоначчи
        fibo2.append(a)
    if b % 2 == 0:
        fibo2.append(b)

    a = a + b           # "третий" член ряда
    b = a + b           # "четвертый" член
    if a > 4*10**6:     # прерываем цикл, если значение а превысило 4 млн
        break

    fibo.append(a)      # переносим третий член в массив чисел фибоначчи
    fibo.append(b)      # аналогично четвертый член

print(fibo)             # вывод чисел фибоначчи до 4 млн
print(fibo2)            # вывод четных чисел фибоначчи до 4 млн
print(sum(fibo2))       # искомая сумма

На выходе получится:
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578]
[2, 8, 34, 144, 610, 2584, 10946, 46368, 196418, 832040, 3524578]
4613732
Ответ написан
Комментировать
@tumerik
Я решил таким методом:

s = [1, 2]

for i in s:
    i += s[-1]
    s.extend([i])
    a = 0
    for i in s:
        if i % 2 == 0:
            a += i
    if i >= 4000000:
        break

print(a)
Ответ написан
Комментировать
@RONG_VANG
Я решил вот таким образом, ответ получился 4613732
fib1 = 1
fib2 = 1
a = []
while fib2 < 4000000:
	i = fib1 + fib2
	if i % 2 == 0:
		a.append(i)
	fib1 = fib2
	fib2 = i
print(sum(a))
Ответ написан
Комментировать
@Lehes
Только начинаю знакомиться с языком да и вообще с программированием
решил так:
f = [1, 2]
a = 0
s = 0 # summ
for i in f:
    c = (f[a] + f[a + 1])
    if c < 4000000:
        f.append(c)
        a += 1
for i in f:
    if i % 2 == 0:
        s = s + i
print(s)

Но очень понравился вариант от MrCryzeese
Ответ написан
Комментировать
@Maks_okn
arr = [1,2]

for i in arr:
    if (i + arr[-1]) > 4000000:
        break
    else:
        arr.append(i + arr[-1])

print(sum([i for i in arr if i %2 == 0]))
Ответ написан
Комментировать
@nesterov_srg
как то так получилось:

arr = [1, 2]
while arr[-1] < 4*10**6:
    arr.append(arr[-1] + arr[-2])
print(sum([i for i in arr if i % 2 == 0]))
Ответ написан
Комментировать
@IvyLou
Как-то так решил, тоже только начинаю изучать язык :

f1 = 1
f2 = 2
result = 0

print(f1, f2, end=' ')

while f2 < 4000000:
if f2%2 == 0:
result += f2
f1, f2 = f2, f1+f2
print(f2, end=' ')


print('Сумма четных элементов : ', result)

Ответ: 4613732
Ответ написан
Комментировать
@CARTMANstr
Только начинаю изучение
x = 1
y = 2
z = 0
while y<4000000 or x<4000000:
    if x % 2 ==0:
        z += x
    elif y % 2 ==0:
        z += y
    x += y
    y += x
print(z)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы