Fibonacci斐波那契数列

题目:

资源限制:
时间限制:1.0s 内存限制:256.0MB


问题描述:
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
输入格式:
输入包含一个整数n
输出格式:
输出一行,包含一个整数,表示Fn除以10007的余数。


说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要出Fn的准确值结果除以10007先计算取余数,直接计算余数往往比先算,再将计算的出原数再取余简单

样例输入:
10
样例输出:
55
样例输入:
22
样例输出:
7704
数据规模与约定:
1 <= n <= 1,000,000。

思路:

递归思路(倒着来): 

n = int(input())

def fibonacci(n):
    if n == 2 or n == 1 :
        return 1
    return (fibonacci(n-1) + fibonacci(n-2))%10007

Fn = int(fibonacci(n))

print(Fn)

循环遍历:

知识点:

F1 = 1
F2 = 1
#注意以下两种表达的的区别

#表达式1 
F1 = F2
F2 = F1 + F2 #此刻F1中的值已经被替换为了F2 

#表达式2
F1,F2 = F1 ,(F1+F2) 
'''
    在这个里面的  F2 = F1+F2  中的F1还是之前F1的值,
并没有被F1 = F2 这半个表达式改变了变量值,因为这是一个语句这个语句
还没有被执行完,所以F1的值还是之前的值
'''

解法:

F1 = 1
F2 = 1
for i in range(0,n-2):#F3需要遍历一次 Fn需要遍历n-2次
    F1,F2 = F2,(F1+F2)
    '''
        将F1看成F2,将F2看成了F3,这里需要注意的是“半个表达式 F2 = F1+F2 ”中的
        F1的值还是F1,未被换成F2.因为这个表达式还未被执行完成,python是动态的语言
        所以在执行这条语句的时候,可能F1改变的记录可能在缓存,由于未被执行完,还没
        放入内存中。
    '''
    
print(F2%10007)

修改:先取余再递推

n=int(input())#键盘读入
F1,F2=1,1
for i in range(3,n+1):
    F1,F2=F2%10007,(F1+F2)%10007#先取余再递推防止超时
    '''
        由于是加法递推,所以很明显先取余再递推和先递推再取余结果是一样的
    但是如果数字太大,造成计算时间太长,因此先取余再递推
    '''
print(F2)

相关类型题:

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值