我试图找到斐波纳契系列的部分和的最后一位数

时间:2017-03-22 06:34:13

标签: python python-2.7

#python2
def sum_fib(m,n):
    a=list()
    a.append(0)
    a.append(1)
    i=2
    while i<=n:
        a.append((a[i-1]+a[i-2])%10)
        if a[i]==1 and a[i-1]==0:
            break
        i+=1
    if n>60:
        a.pop()
    #res=sum(a)%10
    q=n-m
    j=m%60
    su=0

    while q>=0:
        su+=a[j]
        j+=1
        if j==60:
            j=0
        q-=1

    return su%10


if __name__=='__main__':
    num=[int(x) for x in raw_input().split()]
    print sum_fib(num[0],num[1])

此代码工作正常,但需要时间才能获得大的Fibonacci数。请帮我解决一下这个。

输入:1 100000000 得到time limit exceeded-> error Time used: 9.36/5.00

1 个答案:

答案 0 :(得分:2)

您正在尝试使用Fibonacci 60 Repeating Pattern,但效率不高:

通过以下循环,您仍然可以收集数千个Fibonacci数字,而您只需要其中的60个:

while i<=n:
    a.append((a[i-1]+a[i-2])%10)

为避免您需要多次运行这60个数字,您可以使用60个连续斐波纳契数之和的最后一位数始终为0的属性。这实际上意味着您不需要总计数千个数字,只是前60个斐波那契数字的一部分,因为再增加60个数字不会改变总和的最后一个数字。

所以,...你可以通过取其模60来修剪输入变量,然后运行存储的60个Fibonacci列表来计算所需的总和。

以下是改编的代码:

def sum_fib(m,n):
    if m > n:
        return

    # Collect 60 Fibonnaci numbers
    a = [0, 1]
    for i in xrange(2, 60):
        a.append(a[i-1] + a[i-2])

    # Simplify the input arguments, as the last digit pattern repeats with a period of 60, 
    # and the sum of 60 such consecutive numbers is 0 mod 10:
    m = m % 60
    n = n % 60
    # Make sure n is greater than m
    if n < m: 
        n += 60

    su = 0
    for j in xrange(m, n+1): # Assume n index is inclusive
        su += a[j % 60]

    return su % 10

repl.it

上查看它