欧拉项目25-能否进一步提高性能?

时间:2019-04-11 08:04:42

标签: python python-3.x

第12个术语F12是第一个包含三位数的术语。

斐波纳契数列中第一项包含1000个数字的索引是什么?

a = 1 
b = 1
i = 2
while(1):
    c = a + b
    i += 1
    length = len(str(c))
    if length == 1000:
        print(i)
        break
    a = b
    b = c

我得到了答案(工作足够快)。只是在寻找解决这个问题的更好方法

2 个答案:

答案 0 :(得分:0)

如果您回答了该问题,您将在problem thread中找到许多答案的解释。您发布的解决方案几乎可以。只需在每个步骤检查您的ReSharper而不是先将其转换为字符串,即可稍微提高速度。

更好的方法是利用以下事实:当斐波那契数变得足够大时,斐波那契数会收敛到c>=10^999,其中round(phi**n/(5**.5))是黄金比率,而phi=1.6180...则舍入{{1 }}到最接近的整数。让我们考虑找到第一个斐波纳契数超过round(x)位的一般情况。然后,我们正在寻找x

我们只需取两边的对数即可观察到 m,然后求解n

如果您想知道“我怎么知道它已经被第round(phi**n/(5**.5)) >= 10**(m-1)个数字收敛了?”好吧,您可以自己检查,也可以look online

此外,我认为类似这样的问题属于Code Review SEComputer Science SE。甚至Math Overflow也是Euler项目问题​​的好地方,因为许多问题都植根于数论。

答案 1 :(得分:0)

您的解决方案对于项目euler上的#25完全适用。但是,如果您真的想在此处优化速度,则可以尝试使用我在此博客文章中写过的身份来计算斐波那契:https://sloperium.github.io/calculating-the-last-digits-of-large-fibonacci-numbers.html

<Chip>

此代码的测试速度比解决方案快12倍。 (尽管确实需要对最大尺寸进行初步猜测)