python - 由于运行时错误,一个测试用例失败

标签 python math fibonacci

我正在尝试欧拉计划problem 25在 HackerRank 上。

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

最佳答案

只需在示例中使用第二种方法,而不是为输入中的每一行单独计算值,计算值 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 秒。

关于python - 由于运行时错误,一个测试用例失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36711359/

相关文章:

python - 在 Python 中模拟导入的模块

java - 为什么我不能使用 JMockit 模拟数学

perl - 我的斐波那契数列作为递归函数是一个无限循环

python - 可以使用 While in List Comprehension 生成数据

python - 使用索引对 pandas 数据帧中的列进行子集化

c++ - 三次贝塞尔曲线是否完全包含在其控制点的边界框内?

python - 如何找到数组中值的负虚部然后将其变为正值?

ruby-on-rails - 如何修复中止斐波那契数列代码

python - 计算斐波那契数时的取模问题

java - 无法在 PySpark 本地模式下加载 25GB 数据集,可用 56GB RAM