# Uses python3
# Compute the Last Digit of a Large Fibonacci Number
def Fib_Last_Digit(n):
if n == 0 : return 0
elif n == 1: return 1
else:
a,b = 0,1
for i in range(1,n):
c = a + b;
a = b;
b = c;
# Calculate the last digit of the final number
lastdigit = int(repr(c)[-1]);
print(lastdigit);
n = int(input(""));
Fib_Last_Digit(n);
此代码非常有效。但是,我想修改算法以节省更多时间和内存。顺便说一句,输入和输出应该与以前的版本保持一致。
答案 0 :(得分:2)
在计算过程中只保留最后一位数字会节省大量时间:
def fib_last_digit(n):
if n < 2: return n
else:
a, b = 0, 1
for i in range(1,n):
a, b = b, (a+b) % 10
print(b)
n = int(input())
fib_last_digit(n)
处理符合更少字节的数字可以节省时间。
当您使用大量数字时,可以使用here描述的答案保存批次时间,略微修改以仅跟踪最后一位数字:
def fib_last_digit(n):
v1, v2, v3 = 1, 1, 0 # initialise a matrix [[1,1],[1,0]]
for rec in bin(n)[3:]: # perform fast exponentiation of the matrix (quickly raise it to the nth power)
calc = (v2*v2) % 10
v1, v2, v3 = (v1*v1+calc) % 10, ((v1+v3)*v2) % 10, (calc+v3*v3) % 10
if rec == '1': v1, v2, v3 = (v1+v2) % 10, v1, v2
return v2
答案 1 :(得分:1)
周期数为60的斐波纳契数repeats的最后一位数字系列。因此,第N
个斐波那契数与第(N % 60)
位的最后一位相同,后者应为快速计算。作为一项额外的优化,您只能保留每个术语的最后一位:
def fib_last_digit(n):
a, b = 0, 1
for i in range(n % 60):
a, b = b, (a + b) % 10
return a
print([fib_last_digit(n) for n in range(1, 11)])
输出:
[1, 1, 2, 3, 5, 8, 3, 1, 4, 5]
答案 2 :(得分:0)
def fib_digit(n):
f=[1,1]
for i in range(2,n):
f.append((f[i-1]+f[i-2]) % 10 )
return f[-1]
n = int(input())
print(fib_digit(n))
这是最简单的答案之一,我敢肯定,有一个更快的算法。
这是我发现的东西:
f1, f2 = 0, 1
for i in range(int(input())-1):
f1, f2 = f2, (f1+f2)%10
print(f2)
答案 3 :(得分:0)
仅花费-0.002832174301147461秒-即可完成代码。
import time
n = 100000000000000000000000000000000000000000
def printfib(previous, latest, n):
if(latest > n):
return
print(', ', latest, end='')
printfib(latest, previous + latest, n)
start_time = time.time()
print(0, end='')
printfib(0, 1, n)
print(" ")
print("--- %s seconds ---" % (time.time() - start_time))
答案 4 :(得分:-1)
def fib(n):
phi = (1 + 5 ** 0.5) / 2
fib_n = round(((phi** n) - (phi**-n) )/(5 ** .5))
return fib_n % 10
Phi是你的朋友。