繁体   English   中英

找到斐波那契数列部分和的最后一位数字

[英]Finding the last digit of partial sum of Fibonacci series

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
        
    
num = [int(x) for x in raw_input().split()]
print sum_fib(num[0], num[1])

这段代码给出了预期的输出,但是对于大的斐波那契数来说花费了太多时间。 请帮我解决一下这个。

对于输入: 1 100000000

我越来越:

超出时间限制错误。 使用时间:9.36/5.00

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

通过以下循环,您仍然可能收集数千个斐波那契数,而您只需要其中的 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM