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(),是因为我们的目的是在求余数而不是菲波那切数列本身。

若有更优方案,请指正。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐