Javascript-使用数组添加整数

时间:2019-03-22 19:37:51

标签: javascript arrays

我正在使用一个数组来计算2的大数幂。数组相互加和后缀,它们计算进位和循环n-1次,直到我最终将数字作为数组。我这样做是为了避免JavaScript具有15位的限制。

当我达到n = 42时,一切都很好,在这里开始忽略了进位并且数字没有减少,从而产生了错误的答案。

我尝试将在while循环内处理进位的方法从基本加法更改为整数除法和模 听起来很愚蠢,但我添加了一个额外的循环来检查是否有任何元素大于10,但找不到它们。

  for (var n = 1; n <= 100; n++) {
    for (var i = 0, x = [2]; i < n - 1; i++) { // Loop for amount of times to multiply
      x.unshift(0)
      for (var j = x.length - 1; j > 0; j--) { // Double each element of the array
        x[j] += x[j]
      }
      for (j = x.length - 1; x[j] > 0; j--) { // Check if element >= 10 and carry
        while (x[j] >= 10) {
          x[j - 1] += Math.floor(x[j] / 10)
          x[j] = x[j] % 10
        }
      }
      if (x[0] === 0) {
        x.shift()
      }
    }
    console.log('N: ' + n + ' Array: ' + x)
  }

预期结果是数组中的每个元素都将减少为一个数字,并将像下面这样“携带”到元素的左侧:

N: 1 Array: 2
N: 2 Array: 4
N: 3 Array: 8
N: 4 Array: 1,6
N: 5 Array: 3,2
N: 6 Array: 6,4

但从n = 42开始,携带这样的虫子就很麻烦了:

N: 42 Array: 4,2,18,18,0,4,6,5,1,1,1,0,4
N: 43 Array: 8,4,36,36,0,8,12,10,2,2,2,0,8
N: 44 Array: 1,7,5,9,2,1,8,6,0,4,4,4,1,6
N: 45 Array: 2,14,10,18,4,2,16,12,0,8,8,8,3,2
N: 46 Array: 7,0,3,6,8,7,4,4,1,7,7,6,6,4
N: 47 Array: 14,0,7,3,7,4,8,8,3,5,5,3,2,8

像这样抛出它的错误是什么?

2 个答案:

答案 0 :(得分:1)

我认为您的代码不起作用的原因是此行for (j = x.length - 1; x[j] > 0; j--) { // Check if element >= 10 and carry,您不想检查x[j] > 0,而是j > 0

您的第二个循环:for (var i = 0, x = [2]; i < n - 1; i++) {-您不需要它,没有理由在每次迭代中重新计算所有内容,您可以使用以前的结果。

您还可以通过以下方式将值加倍:x = x.map(n => n * 2)(对我来说似乎更常规)。

并且不需要x[j - 1] += Math.floor(x[j] / 10)可能只是x[j - 1] += 1,因为先前的数字最多为9,翻倍的数字不超过18,所以只有x[j] >= 10为1的情况

可能是代码:

let x = [2] // starting point
for (var n = 1; n <= 100; n++) {
  x = [0, ...x].map(n => n * 2)
  for (j = x.length - 1; j > 0; j--) {
    if (x[j] >= 10) {
      x[j - 1] += 1
      x[j] %= 10
    }
  }
  if (x[0] === 0) {
    x = x.slice(1)
  }
  console.log('N: ' + n + ' Array: ' + x)
}

答案 1 :(得分:0)

如果您想要的只是2的大数幂,为什么要经历使用列表进行计算的疯狂麻烦?这不完全一样吗?

function BigPow2(x, acc=2.0) {
    //document.writeln(acc);
    acc = acc >= 5 ? acc / 5 : acc * 2;
    return x <= 1 ? acc : BigPow2(x-1, acc);
}

或者使用BigInt?