我在这里得到正确答案: 总和 - 4613732 时间-0.0
import time
def factorial():
i=1
j=2
fac=[]
final_list=[]
fac.append(i)
fac.append(j)
z=i+j
while(z<4000000):
z=i+j
fac.append(z)
i=j
j=z
for n in fac:
if(n%2==0):
final_list.append(n)
return sum(final_list)
if __name__ == "__main__":
start = time.clock()
print "Sum is"+ " " + str(factorial())
print "Time taken"
print time.clock() - start
只想了解一下我是如何在python中编写逻辑的。是好还是可以做得更好(w.r.t编码标准等)?
答案 0 :(得分:0)
这是一个非常巧妙的技巧。
这是斐波那契数字:
F_1 : 1
F_2 : 1
F_3 : 2
F_4 : 3
F_5 : 5
F_6 : 8
F_7 : 13
F_8 : 21
F_9 : 34
序列是(奇数,奇数,偶数)重复。
偶数是两个奇数的总和
因此(奇数和偶数之和)=(奇数之和)+(偶数之和)= 2 *(奇数之和)。 只要我们总结到一个偶数值的值。
即。
1 + 1 + 2 + 3 + 5 + 8 + 13 + 21 + 34 =
1 + 1 + (1+1) + 3 + 5 + (3+5) + 13 +21 + (13 + 21) =
2 * (1 + 1 + 3 + 5 + 13 + 21 )
现在,前N个斐波那契数的总和是第N + 2个斐波纳契数 - 1
继续我们的序列,我们得到34,55,89,......
所以
1 + 1 + 2 + 3 + 5 + 8 + 13 + 21 + 34 = 89 - 1
等等
1 + 1 + 3 + 5 + 13 + 21 = (89 - 1)/2 = 44.
这引出了以下算法:
N
和F_N
,F_N <= M
但F_{N+1} > M
。为此,我们使用维基百科 F_N
是偶数,我们的结果只是(F_{N+2}-1)/2
,请注意F_{N+2}
可以在O(log(N))时间内计算。F_N
奇怪,我们退后一步,直到我们找到一个偶数,(一步或两步)。
(F_{N+1}-1)/2 + F_N
,(F_N-1)/2 + F_{N-1} + F_N
所有这些步骤都可以在log(N)
时间内完成。