我正在使用一个数组来计算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
像这样抛出它的错误是什么?
答案 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?