簡體   English   中英

karatsuba算法,超出最大調用堆棧大小

[英]karatsuba algorithm, Maximum call stack size exceeded

我寫的是karatsuba algh的自己的變種,但不能使它與真正的大整數一起工作

'use strict';

const karatsuba = function (x, y) {
  if (x < 10 || y < 10) return x * y;

  const strX = String(x);
  const strY = String(y);

  const n = Math.min(strX.length, strY.length);
  const m = Math.ceil(n / 2);

  const leftX = strX.slice(0, strX.length - m),
        rightX = strX.slice(strX.length - m, strX.length),

        leftY = strY.slice(0, strY.length - m),
        rightY = strY.slice(strY.length - m, strY.length);

  const prod1 = karatsuba(leftX, leftY),
        prod2 = karatsuba(rightX, rightY),
        prod3 = karatsuba(addAny(leftX, rightX), addAny(leftY, rightY));

  const a = prod1 + String(Math.pow(10, 2 * m)).slice(1),
        b = (prod3 - prod1 - prod2) + String(Math.pow(10, m)).slice(1),
        ab = addAny(a, b);

  return addAny(ab, prod2);
};

function addAny(a, b) {
  const MAX_INT = 9007199254740992,
      intA = parseInt(a),
      intB = parseInt(b);

  if ((intA + intB) < MAX_INT) return intA + intB;

  return sumStrings(a + '', b + '');
}



function sumStrings(a, b) {
  let res = '', c = 0;

  a = a.split('');
  b = b.split('');

  while (a.length || b.length || c) {
    c += ~~a.pop() + ~~b.pop();
    res = c % 10 + res;
    c = c > 9;
  }

  return res.replace(/^0+/, '');
}

它適用於像3957322621233333和5548313756335578這樣的投注,但當我嘗試使用它與大型的像76715432964249374812219365555和32141964835273822784327848699719代碼崩潰

RangeError: Maximum call stack size exceeded

你在通話中省略了引號,不是嗎?

> katsuba(76715432964249374812219365555,32141964835273822784327848699719)
RangeError: Maximum call stack size exceeded
    at karatsuba (repl:2:5)
    at karatsuba (repl:16:15)
    at karatsuba (repl:17:9)
    at karatsuba (repl:17:9)
    at karatsuba (repl:17:9)
    at karatsuba (repl:17:9)
    at karatsuba (repl:17:9)
    at karatsuba (repl:17:9)
    at karatsuba (repl:17:9)
    at karatsuba (repl:17:9)

76715432964249374812219365555大於5**53 ,代碼中的MAX_INT 數字文字隱式轉換為浮點數7.671543296424938e+28 ,您的算法會以數字格式扼流。

然而,您的實現中存在一些錯誤,因為即使您使用字符串文字,計算結果也是錯誤的:

> karatsuba('76715432964249374812219365555', '32141964835273822784327848699719')
'1045731853714033916818600413783559075'

代替

'2465784748659709650840276767201870909665028593909797886779045'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM