javascript-如何找到真正大整数的余数

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 >=

我通过这样做找出斐波那契序列的第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 >= 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