一个测试用例由于运行时错误而失败

时间:2016-04-19 07:25:43

标签: python math fibonacci

我在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()值存储在变量中而不是重新计算,并没有多大帮助。

2 个答案:

答案 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,它会更快一点