Как я могу получить целое число в Math.pow (10, 10000000) - PullRequest
0 голосов
/ 18 февраля 2019

Я всегда получаю бесконечность от:

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

Итак, я могу получить целое число из этого?Может быть, я не понимаю эту задачу https://www.codewars.com/kata/5511b2f550906349a70004e1/train/javascript? Кто знает, покажите мне, как решить это?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Ссылка, которую вы указываете, запрашивает последнюю цифру номера.Чтобы найти такую ​​вещь, было бы безумно вычислять чрезвычайно большое число (которое может превысить емкость памяти известного юниверса для записи (*)) только для того, чтобы найти окончательную цифру.Рабочий мод 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 бит в длину.Поскольку во вселенной меньше атомов, это число слишком велико, чтобы его можно было хранить, не говоря уже о том, что на вычисление уходит слишком много времени.

0 голосов
/ 18 февраля 2019

Javascript имеет максимально безопасное целое число:

Number.MAX_SAFE_INTEGER
9007199254740991

safe = возможность точно представлять целые числа и правильно их сравнивать

В вашем случае число больше:

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

Или не меньше:

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

Вы можете использовать целочисленную библиотеку произвольного размера, например big-integer , для работы с большими целыми числами

...