Python 计算斐波那契函数时的模问题

Python 计算斐波那契函数时的模问题,python,python-3.x,fibonacci,modulo,Python,Python 3.x,Fibonacci,Modulo,我试图解决一个问题,需要我计算10^18模10^9+7的斐波那契数。在线法官说我在小案件中得到了正确的答案(不需要模),但在大案件中我得到了错误的答案 否则,该算法没有问题,但将结果保存到字典表中的记忆操作似乎失败了。我不知道为什么 luku = int(input()) table = {0:0, 1:1, 2:1} def fib(num): if num in table: return table[num]; if num % 2 == 0:

我试图解决一个问题,需要我计算10^18模10^9+7的斐波那契数。在线法官说我在小案件中得到了正确的答案(不需要模),但在大案件中我得到了错误的答案

否则,该算法没有问题,但将结果保存到字典
表中的记忆操作似乎失败了。我不知道为什么

luku = int(input())
table = {0:0, 1:1, 2:1}

def fib(num):

    if num in table:
        return table[num];

    if num % 2 == 0:
        puoli = num / 2;
        ans = (fib(puoli) * (2 * (fib(puoli + 1)) - fib(puoli))) % 1000000007;
        table[num] = ans;
        return ans;
    else:
        puoli = (num-1) / 2;
        ans = (fib(puoli + 1)*fib(puoli + 1) + fib(puoli)*fib(puoli)) % 1000000007;
        table[num] = ans;
        return ans;


print(fib(luku))

例如,通过输入547747309834771038,我得到的是946469205,而不是正确答案795317107。

记忆没有问题

可能令您惊讶的是,问题在于浮点精度(是的,您的数字被截断)

应将浮点除法运算符
/
(单斜杠)替换为整数除法运算符
/
(双斜杠)

下面的代码和上面提到的唯一修复程序对我有效:

luku = int(input())
table = {0:0, 1:1, 2:1}

def fib(num):
    if num in table:
        return table[num];

    if num % 2 == 0:
        puoli = num // 2;
        ans = (fib(puoli) * (2 * (fib(puoli + 1)) - fib(puoli))) % 1000000007;
        table[num] = ans;
        return ans;
    else:
        puoli = (num-1) // 2;
        ans = (fib(puoli + 1)*fib(puoli + 1) + fib(puoli)*fib(puoli)) % 1000000007;
        table[num] = ans;
        return ans;


print(fib(luku))
见:


谢谢,成功了。什么时候应该使用整数除法符号?什么时候数字对于正常除法符号来说太大了?
/
会生成一个浮点结果,与整数结果不同,浮点结果的精度是有限的。但是它被称为memoizing/memoizing,没有r.@Quiti在执行整数除法时使用
/
a/b
的结果总是一个浮点数,即使
a
b
都是整数。@WalterTross哦,哈。这是一个新单词,我刚刚认识到它的存在!
ibug@ubuntu:~ $ python3 t.py
54774730983471038
795317107