Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
直接来程序:
n=int(input())
def fbnq(n):
if n==1:
return 1
elif n==2:
return 1
else:
return (fbnq(n-1)+fbnq(n-2))
def yushu(n):
a=6765
b=939
m=22
while m<=n:
r=a+b
if r>10007:
r=r%10007
a,b=b,r
m+=1
return b
if n<21:
print(fbnq(n))
elif n==21:
print(939)
else:
print(yushu(n))
这个程序没有超时。
思路是:
1,我们可知道前20个数值是不超过10007的,而且用递归也不费太多时间,所以这种情况直接用递归打印出来。
2,单独打印出n为21时的值,是为了下一步。
3,yushu()函数是为了处理n>21的情况,此时用递归太费时间。我们直接处理除去10007的余数,不管第n项的值是多少。这样比递归节省很多时间。
经过考虑,可以化简程序为:
n=int(input())
def yushu(n):
a=1
b=1
for i in range(n-1):
a,b=b,(a+b)%10007
print(a)
yushu(n)
之所以将函数名命名为yushu(),是因为我们的目的是在求余数而不是菲波那切数列本身。
若有更优方案,请指正。