[英]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.