Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-使用数组添加整数_Javascript_Arrays - Fatal编程技术网

Javascript-使用数组添加整数

Javascript-使用数组添加整数,javascript,arrays,Javascript,Arrays,我使用数组来计算2的大幂。数组相互相加,并计算进位和循环n-1次,直到我以数字作为数组结束。我这样做是为了避免JavaScript的15位限制 当我达到n=42时,一切正常,进位开始被忽略,数字没有减少,从而产生错误的答案 我尝试将while循环中处理进位的方法从基本加法改为整数除法和模 听起来很愚蠢,但我添加了一个额外的循环来检查是否有任何元素大于10,但它没有找到它们 for (var n = 1; n <= 100; n++) { for (var i = 0, x =

我使用数组来计算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=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

什么错误会像这样抛出它?

我认为代码不工作的原因是j=x.length-1的这一行;x[j]>0;j-{//检查元素>=10和进位,您不想检查x[j]>0,但检查j>0

还有您的第二个循环:对于var i=0,x=[2];i 您也可以通过这种方式将值加倍:x=x.mapn=>n*2对我来说似乎有点保守

不需要x[j-1]+=Math.floorx[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)
}

如果你想要的只是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);
}

或者可选地,使用BigItn.< /P>你应该真正考虑使用。它现在使用了一个后缀N在数字文字上有原生的支持。甚至不知道存在。谢谢。尽管你应该使用BigIt,就像你的算法一样,你不应该检查内部for for j>0而不是x[j]吗?>0?第8行您也可以尝试调试。代码过于复杂,无法理解并在我脑海中逐步查找更大的数字。调试它您应该会在一秒钟内发现问题,但无论如何,必须有更好的方法来计算,而不必使用列表。

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