【问题标题】:One test case fails due to runtime error一个测试用例因运行时错误而失败
【发布时间】: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() 值存储在变量中而不是重新计算,但没有多大帮助。

【问题讨论】:

    标签: python math fibonacci


    【解决方案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 秒。

    【讨论】:

      【解决方案2】:

      pow(x, y) 总是比x**y 慢,而且pow() 方法不能用于长整数。

      试试x**y,会快一点

      【讨论】:

      • 谢谢!但我再次重申,问题不在于时间,而在于更节省空间。
      猜你喜欢
      • 2014-03-03
      • 2023-03-08
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多