我在项目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))
我不确定什么行不通。有什么帮助吗?
答案 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)