项目欧拉#2

时间:2012-12-21 03:59:38

标签: python

我在项目euler网站上遇到了问题,我被困在第二个。

问题在于:

  

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

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

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

这是我的代码:

a = 0
b = 0
c = 2
d = []
x = 1
y = 2
z = [1,2]
while x + y <= 4000000:
    z.append(x+y)
    x = y
    y = z[c]
    c += 1

size = len(z)
while a < (size - 1):
    if z[a] % 2 == 0:
        d.append(z[a])
    a += 1

print(sum(d))

我不确定什么行不通。有什么帮助吗?

8 个答案:

答案 0 :(得分:5)

迭代数组的 pythonic 方法是使用in。此外,使用0评估为False的事实:

# Unpythonic
size = len(z)
while a < (size - 1):
    if z[a] % 2 == 0:
        d.append(z[a])
    a += 1

# Pythonic
for num in z:
    if not num % 2:
        d.append(num)

# Even more pythonic
d = [num for num in z if not num % 2]

只有一个循环的奖励:

a = 1
b = 2
s = 0
while b <= 4000000:
    if not b % 2:
        s += b
    a, b = b, a + b
print(s)

答案 1 :(得分:2)

这是另一种方法:

def fib():
        x,y = 0,1
        while True:
            yield x
            x,y = y, x+y

def even(seq):
    for number in seq:
        if not number % 2:
            yield number

def under_a_million(seq):
    for number in seq:
        if number > 4000000:
            break
        yield number   

print sum(even(under_a_million(fib())))

-M1K3

答案 2 :(得分:1)

你的第二个循环不考虑列表中的最后一个元素。

while a < (size - 1):

应该是

while a < size:

此外,不需要两个循环和一个列表。你只需一个循环即可完成。当您计算新的斐波那契项时,您可以检查它是否均匀并将其添加到运行总和中。

答案 3 :(得分:0)

这是我的解决方案

start=1
end=100
FSeq=[]
Evens=[]

def isEven(i):
        if (i % 2 == 0):
                return i

def solution02():
        for i in range(start,end):
                if i > 2:
                        brev=FSeq[i-2]+FSeq[i-3]
                        FSeq.append(brev)
                else:
                        FSeq.append(i)
#       print FSeq


        for l in FSeq:
                if isEven(l) and l < 4000000:
                        Evens.append(l)
        print sum(Evens)


solution02()

答案 4 :(得分:0)

要获得更有效的解决方案,请应用以下逻辑

Fibbonaci Series =>  1   2  3  5  8  13  21  34  55  89 144
Index            =>  0   1  2  3  4  5   6    7   8   9  10

为了获得均匀的Fibonacci,我必须添加以下索引值[1 4 7 10] 在这里,我感觉到一些模式

[1 4 7 10] =&gt;我需要提前指数3

所以如何将指数推进3

#  k = i+j = > 3  13  55
#  i = k+j  => 5  21  89
#  j = k+i  => 8  34  144

def evenFibSumx(i,j):
    max = 3999999
    eventsum = 2
    k = 0
    while  1 :
        k = i + j
        i = k + j
        j = k + i
        if i >= max:
            break
        if j%2 == 0:
           eventsum +=j
    return eventsum;

def main():
    data = evenFibSumx(1,2)
    print (data);

if __name__ == "__main__":
main()

答案 5 :(得分:0)

测试用例包含更大的输入,因此我们的程序在达到10秒以上时终止一次。所以这里只使用一个循环就可以解决这个问题。如果你们知道任何其他更好的解决方案,请告诉我们!

t = int(input().strip())
for a0 in range(t):
    sum = 0
    n = int(input().strip())
    a = 1
    b = 2
    s = 0
    while b <= n:
        if not b % 2:
            s += b
        a, b = b, a + b
    print(s)

答案 6 :(得分:0)

var liste:ArrayList<Int> = ArrayList()
liste.add(1)
liste.add(2)
var sayac=2
var toplam = 0
while(liste[liste.lastIndex] < 4000000){
    liste.add(liste[sayac-1] + liste[sayac-2])
    sayac++
}
for(i in 0..liste.size-1){
    if(liste[i] % 2 == 0){
        toplam = toplam + liste[i]
    }
}
println(toplam)

我用科特林语写这篇文章,希望对您有帮助

答案 7 :(得分:0)

这是我的python代码

first_num=0
second_num=1
sum_num=0
new_num=0
while sum_num <= 4000000:
    sum_num=first_num + second_num
    if sum_num%2 == 0:
        new_num+=sum_num
    first_num=second_num
    second_num=sum_num

print(new_num)