Python 计算斐波那契函数时的模问题
我试图解决一个问题,需要我计算10^18模10^9+7的斐波那契数。在线法官说我在小案件中得到了正确的答案(不需要模),但在大案件中我得到了错误的答案 否则,该算法没有问题,但将结果保存到字典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:
表中的记忆操作似乎失败了。我不知道为什么
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