Большие числа, требующие более 64-битного представления

Я использую java и должен иметь дело с числами, большими, чем длинными (это 64 бита). Что я должен использовать? Каков размер BigInteger в java?

Ответы

Ответ 1

Как вы упомянули в своем вопросе, вы должны использовать BigInteger.

Они могут быть настолько большими, насколько вам нужно - до тех пор, пока у вас не закончится память.

Ответ 2

Каков размер BigInteger в java?

Это немного сложно. Проблема в том, что в javadocs нет четкой спецификации предела.

  • Класс использует int[] для представления величины. Это означает, что он может потенциально представлять числа до ((2^32)^(2^31 - 1).

  • API имеет метод, который возвращает число в виде массива байтов с 2-мя дополнениями. Предел для этого - ((2^8)^(2^31 - 1).

  • API имеет другой метод, который возвращает размер числа в битах... как int. Это подразумевает предел 2^(2^31 - 1) или, может быть, 2^(2^32).

На практике эти цифры настолько велики, что вы, вероятно, сначала столкнетесь с ограничениями пространства кучи (или ограничениями производительности процессора).


проблема заключается в том, что я должен найти квадратный корень из числа.

Вы должны быть в состоянии найти алгоритм вычисления квадратных корней в ваших учебниках по математике (или Википедии). Кодирование должно быть простой задачей.

(Я бы указал вам пример кода, за исключением того, что это пахнет "домашней работой", и я не полностью доверяю коду, который нашел.)

Не забывайте, что большинство целых чисел имеют иррациональный квадратный корень...

Ответ 3

вы ищете либо класс BigDecimal, либо просто нужны целые числа, чем BigInteger. Его произвольная точность, поэтому размер изменяется в зависимости от того, насколько велики числа, которые вы вводите

Ответ 4

Чтобы найти квадратный корень из BigInteger, вам нужно выполнить поиск google с ответом "-StackOverflow". https://www.google.com/search?q=java+extract+root+bignum&ie=utf-8&oe=utf-8#q=java+root+BigInteger+-stackoverflow.com+-stackexchange.com дает первую ссылку на http://faruk.akgul.org/blog/javas-missing-algorithm-biginteger-sqrt/ Здесь является одним из алгоритмов. Предполагается, что Java будет "писать один раз, использовать всюду". Ну, некоторые пользователи SO верят, что вы должны изобретать велосипед. Спросите их о модуле, который они отвечают, "пахнет домашней работой, сделайте это самостоятельно". И да, BigInteger наполовину испечен. Он не может делать логарифмы или корни из коробки. Это очень медленно. Алгоритм приведен ниже.

BigInteger sqrt(BigInteger n) {
  BigInteger a = BigInteger.ONE;
  BigInteger b = new BigInteger(n.shiftRight(5).add(new BigInteger("8")).toString());
  while(b.compareTo(a) >= 0) {
    BigInteger mid = new BigInteger(a.add(b).shiftRight(1).toString());
    if(mid.multiply(mid).compareTo(n) > 0) b = mid.subtract(BigInteger.ONE);
    else a = mid.add(BigInteger.ONE);
  }
  return a.subtract(BigInteger.ONE);
}