【发布时间】:2016-04-19 07:25:43
【问题描述】:
我在 HackerRank 上尝试 Project Euler problem 25。
我尝试了使用 Binet 的 Formula 的蛮力方法。
import math
for _ in range(int(input())):
numLen = int(input())
for x in range(1, 5000):
fib = 1/pow(5,.5)*(pow(((1+pow(5,.5))/2),x) - pow(((1-pow(5,.5))/2),x))
if(numLen == len(str(int(fib)))):
print(x)
break
这里 5000 是一个任意数字,假设输入不超过这个数字,问题不在这里,因为它是运行时错误,我认为是因为它超出了整数范围(不确定)。
它还可以在不到 0.25 秒的时间内计算其他测试用例。
我搜索了一下,找到了this。
但是通过那种重复的方法:
import math
for _ in range(int(input())):
a = 1
b = 0
n = int(input())
term = 1
while len(str(a)) != n:
a, b = a+b, a
term+=1
print (term)
超过 10 秒时给出超时。
能否请您帮我想办法改进第一种方法并优化第二种方法。
注意:我尝试将 pow() 值存储在变量中而不是重新计算,但没有多大帮助。
【问题讨论】: