如何在 Math.pow(10, 10000000) 中获取整数

How can I get integer in Math.pow(10, 10000000)

我总是从中得到无穷大:

let power = Math.pow(2, 10000000);
console.log(power); //Infinity

那么,我可以从中得到整数吗? 也许我不明白这个任务https://www.codewars.com/kata/5511b2f550906349a70004e1/train/javascript?谁知道,告诉我如何决定?

Javascript 有一个最大安全整数:

Number.MAX_SAFE_INTEGER
9007199254740991

安全 = 准确表示整数并正确比较它们的能力

在你的情况下,数字更大:

Math.pow(2, 10000000) >= Number.MAX_SAFE_INTEGER
true

或不小于:

Math.pow(2, 10000000) <= Number.MAX_SAFE_INTEGER
false

您可以使用任意大小的整数库,例如 big-integer 来处理更大的整数

您提供的link要求输入号码的最后一位。为了找到这样的东西,计算一个非常大的数字(这可能会超过已知宇宙的存储容量来记下(*))只是为了找到最后一位数字,这将是疯狂的。工作 mod 10.

两个观察结果:

1) n^e % 10 === d^e % 10 // d = last digit of n
2) If e = 10q+r then n^e % 10 === (n^10)^q * n^d %10

这让我们可以写:

const lastDigit = function(str1, str2){
  //in the following helper function d is an integer and exp a string
  const lastDigitHelper = function(d,exp){
    if(exp.length === 1){
      let e = parseInt(exp);
      return Math.pow(d,e) % 10;
    } else {
      let r = parseInt(exp.slice(-1));
      let q = exp.slice(0,-1);
      return lastDigitHelper(Math.pow(d,10) % 10,q) * Math.pow(d,r) % 10;
    }
  }

  let d = parseInt(str1.slice(-1));
  return lastDigitHelper(d,str2);
}

这通过了所有测试,但效率不高。递归辅助函数可以用循环代替。

(*) 为了好玩:其中一个测试用例是计算

的最后一位数字
1606938044258990275541962092341162602522202993782792835301376 ^ 2037035976334486086268445688409378161051468393665936250636140449354381299763336706183397376

如果以 2 为基数编写,则此数字的长度约为 4.07 x 10^92 位。由于少于那么多atoms in the universe,这个数字太大而无法存储,更不用说计算也太耗时了。