我在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()值存储在变量中而不是重新计算,并没有多大帮助。
答案 0 :(得分:1)
在示例中使用第二种方法,但不是为输入中的每一行单独计算值,而是计算值1...5000
一次并缓存它们:
res = [0]
a = 0
b = 1
term = 1
while len(res) <= 5000:
a, b = b, a + b
if len(str(a)) >= len(res):
res.append(term)
term += 1
print('\n'.join(str(res[int(input())]) for _ in range(int(input()))))
对于输入2 3 4
,它将产生预期的输出12 17
。在我的机器上预先计算值大约需要3秒钟。
答案 1 :(得分:0)
pow(x, y)
总是慢于x**y
,并且pow()
方法也不能用于长整数。
尝试x**y
,它会更快一点