【问题标题】:How can I get integer in Math.pow(10, 10000000)如何在 Math.pow(10, 10000000) 中获取整数
【发布时间】:2019-07-11 18:26:09
【问题描述】:

我总是从以下方面得到无穷大:

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

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

【问题讨论】:

  • Javascript 中最大的整数是 (2^53)-1。您的结果对于单个变量来说太大了。
  • 结果将显着大于Number.MAX_SAFE_INTEGER,其中算术将失败。为什么需要这么大的数字?
  • 你只是为了好玩而尝试这个吗?或任何真实情况?这个数字在实际场景中通常不会存在。
  • Wolfram alpha 说您需要 3,010,300 位数字来存储结果。
  • 这是写在这个任务codewars.com/kata/5511b2f550906349a70004e1/train/javascript。我需要得到字符串结果,但是数字。

标签: javascript math integer pow


【解决方案1】:

您提供的链接要求输入号码的最后一位。为了找到这样的东西,为了找到最后一个数字而计算一个非常大的数字(可能超过已知宇宙的存储容量(*))将是疯狂的。工作模式 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 的数量少于那么多,因此数量太大而无法存储,更不用说计算太耗时了。

【讨论】:

    【解决方案2】:

    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 来处理更大的整数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多