Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
问题:
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
输入格式:
输入包含一个整数n。
输出格式:
输出一行,包含一个整数,表示Fn除以10007的余数。
解法1 (递归) 不推荐使用
解法1 使用递归的思想,,当n较大时,会出现运行超时的问题,并且不太好理解
def tk(n):
if n==1 or n==2:
return 1
else:
return tk(n-1)+tk(n-2)
n=int(input())
a=tk(n)
a=a%10007
print(a)
解法2 (使用列表)
解法2 使用列表存储数,使用使用循环,将数添加到列表中,然后供下次计算。在最后只需要将列表最后一个数打印就好,
def tk2(n):
list=[1,1]
for i in range(n-2):
list.append(list[-1]+list[-2])
return list[n-1]
n=int(input())
a=tk2(n)
a=a%10007
print(a)
解法3(解法2的优化)
解法2使用了列表存储每一次计算出的Fibonacci数列数,,如果当n较大的情况下,会出现导致列表存不下这么多,当然现实中是没问题的,,但是在题目中规定了内存占用大小。所以解法3会对其进行优化,采用3个变量来存储
def tk2(n):
a=1
b=1
c=0
if n==1 or n==2:
return 1
else:
for i in range(n-2):
c=a+b
a,b=b,c
return c
n=int(input())
a=tk2(n)%10007
print(a)
解法4 (本人最优)
解法3解决了内存超限的问题,但是还有一点点小问题,我们条件中要求 时间限制1.0s ,而我在测试解法3时,运行时长是1.062ms,所以还是不符合要求,从而催动了解法4的诞生。
n=eval(input())
a=1
b=1
c=0
if n==1 or n==2:
print(1)
else:
for i in range(2,n):
c=(a+b)%10007
a,b=b,c
print(c)
解法4是本人写的最优秀的解法。。内存占用 8.681mb 运行时长 218ms