【发布时间】:2022-01-25 12:04:00
【问题描述】:
我目前正在使用矩阵乘法公式为斐波那契数列创建算法。
我基于以下 python 代码编写了我的 JavaScript 代码。但是,确认输出了另一个值 [case fib(150)]。我认为 % mod 是错误的,但是我该如何解决这个问题呢?
javascript 代码
const n = parseInt(prompt("Number"));
const mod = 1000000007;
const fib = () => {
const zero = [
[1, 1],
[1, 0],
];
const base = [
[1],
[1]
];
const power = (a, num) => {
if (num === 1) return a;
else if (num % 2 != 0) return multi(power(a, num - 1), a);
else return power(multi(a, a), parseInt(num / 2));
};
const multi = (a, b) => {
const temp = Array.from(Array(2), () => Array(b[0].length).fill(0));
for (let i = 0; i < 2; i++) {
for (let j = 0; j < b[0].length; j++) {
let sum_num = 0;
for (let k = 0; k < 2; k++) {
sum_num += a[i][k] * b[k][j];
}
temp[i][j] = sum_num % mod;
}
}
return temp;
};
return multi(power(zero, n - 2), base)[0][0];
};
if (n === 0) {
console.log(0);
} else if (n < 3) {
console.log(1);
} else {
console.log(fib());
}
python 代码
import sys
input = sys.stdin.readline
MOD = 1000000007
adj=[[1,1],[1,0]]
start=[[1],[1]]
N = int(input())
def power(adj,n):
if n == 1:
return adj
elif n % 2:
return multi(power(adj,n-1), adj)
else:
return power(multi(adj,adj), n//2)
def multi(a,b):
temp=[[0]*len(b[0]) for _ in range(2)]
for i in range(2):
for j in range(len(b[0])):
sum_n = 0
for k in range(2):
sum_n += a[i][k]*b[k][j]
temp[i][j]= sum_n % MOD
return temp
if N < 3:
print(1)
else:
print(multi(power(adj,N-2),start)[0][0])
【问题讨论】:
-
尝试使用 BigInt 吗?
-
我试试看。
-
天哪。谢谢你,凯莉。我将其更改为 bigint 并成功。 :)
-
@momo 大多数语言,包括 JavaScript,对称为
int的类型的范围都是有限的。 Python 没有。斐波那契数字增长得相当快:-) -
@Stef 如果你保持
% 1000000007-ing 他们就像在这里做的那样,他们不会。但是对于 JavaScript 的 floats 来说还是太多了。
标签: javascript python algorithm