javascript-如何找到真正大整数的余数
我通过这样做找出斐波那契序列的第n个数:javascript-如何找到真正大整数的余数,javascript,Javascript,我通过这样做找出斐波那契序列的第n个数: function add(a, b) { while (a.length < b.length) a.unshift(0); while (a.length > b.length) b.unshift(0); var carry = 0, sum = [] for (var i = a.length - 1; i >= 0; i--) { var s = a[i] + b[i] + carry; if (s >=
function add(a, b) {
while (a.length < b.length) a.unshift(0);
while (a.length > b.length) b.unshift(0);
var carry = 0, sum = []
for (var i = a.length - 1; i >= 0; i--) {
var s = a[i] + b[i] + carry;
if (s >= 10) {
s = s - 10;
carry = 1;
} else {
carry = 0;
}
sum.unshift(s);
}
if (carry)
sum.unshift(carry);
return sum;
}
function fib(n) {
var f1 = [0];
var f2 = [1];
while (n--) {
var f3 = add(f1, f2)
f1 = f2;
f2 = f3;
}
return f1.join("");
}
但是,返回NaN
。这里有一个输出到控制台.log
那么,我如何找到1995年斐波那契数除以8的余数呢 我在尝试验证IBAN号码(欧洲银行账户标准)时遇到了这个问题。它利用一个控制编号来避免错误输入账户的交易(modulo 97结果应始终为1) 我找到了一个gist(),它也可以满足您的需要。这是有用的部分(注意:divident参数必须是字符串):
模=函数(divident,除数){
var cDivident='';
var-cRest='';
用于(divident中的变量i){
var cChar=divident[i];
var cOperator=cRest+''+Cdivint+''+Char;
if(cOperator
基本上,它将大的数字分割成更小的数量,可以由javascript处理。
这是一把小提琴:
您所描述的是数论的一个非常特殊的应用,称为: 在数论中,第n个Pisano周期,写为π(n),是模为n的斐波那契数序列重复的周期。例如,模3的斐波那契数是0、1、1、2、0、2、2、1、0、1、1、2、0、2、2、1等,前八个数重复,因此π(3)=8 n=8的Pisano周期为12,因此您要查找重复序列的第
(1995%12)
,因此:
0 1 1 2 3 5 0 5 5 2 7 1
^
更新
如注释中所述,在每对加法中,可以应用模来保持数字可控:
function fib(n, mod)
{
if (n == 0) {
return 0;
} else if (n <= 2) {
return 1;
}
var current = 1,
tmp,
prev = 1;
while (n > 2) {
tmp = current;
current = (current + prev) % mod;
prev = tmp;
--n;
}
return current;
}
fib(1995, 8); // 2
函数fib(n,mod)
{
如果(n==0){
返回0;
}else if(n2){
tmp=电流;
当前=(当前+上一个)%mod;
prev=tmp;
--n;
}
回流;
}
fib(1995,8);//2.
var cache={};
var结果=0;
函数fib_mod(编号,mod){
if(cache[number])返回cache[number];
如果(数字<3)结果=1%mod;//第一个是1,第二个也是1
else结果=(fib_mod(数字2,mod)+fib_mod(数字1,mod))%mod;
缓存[编号]=结果;
返回结果;
}
fib_mod(1995,8);//输出为2
jsiddle在这里:除号是
/
,而不是%
@Jurik我想找到余数而不是值好的-这是不可能的,因为无穷大
是fib(1995)/8
的结果,看起来你超过了Javascript中的最大整数大小。检查:并尝试一个大的数字库。如果它只是关于计算斐波那契数模,那么一些数字在计算时只取模,即f(n)%m=(f(n-1)+f(n-2))%m,这样你就不会溢出。你能发布一个提琴吗?这个答案与Javascript无关,但是很好的努力。没有皮萨诺,你可以说:fn除以8的余数等于:除以fn-1和fn-2的余数之和的余数这正是Aleksandr Nikiforov所评论的。@chris97ong我添加了一个连续应用模来寻找答案的例子。
0 1 1 2 3 5 0 5 5 2 7 1
^
function fib(n, mod)
{
if (n == 0) {
return 0;
} else if (n <= 2) {
return 1;
}
var current = 1,
tmp,
prev = 1;
while (n > 2) {
tmp = current;
current = (current + prev) % mod;
prev = tmp;
--n;
}
return current;
}
fib(1995, 8); // 2
var cache = {};
var result = 0;
function fib_mod(number, mod) {
if( cache[number] ) return cache[number];
if( number < 3 ) result = 1 % mod; // 1st is 1, 2nd is 1 too
else result = (fib_mod(number-2, mod) + fib_mod(number-1, mod)) % mod;
cache[number] = result;
return result;
}
fib_mod(1995,8); // output is 2