Ответ 1
Как вы упомянули в своем вопросе, вы должны использовать BigInteger.
Они могут быть настолько большими, насколько вам нужно - до тех пор, пока у вас не закончится память.
Я использую java и должен иметь дело с числами, большими, чем длинными (это 64 бита). Что я должен использовать? Каков размер BigInteger в java?
Как вы упомянули в своем вопросе, вы должны использовать BigInteger.
Они могут быть настолько большими, насколько вам нужно - до тех пор, пока у вас не закончится память.
Каков размер 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)
.
На практике эти цифры настолько велики, что вы, вероятно, сначала столкнетесь с ограничениями пространства кучи (или ограничениями производительности процессора).
проблема заключается в том, что я должен найти квадратный корень из числа.
Вы должны быть в состоянии найти алгоритм вычисления квадратных корней в ваших учебниках по математике (или Википедии). Кодирование должно быть простой задачей.
(Я бы указал вам пример кода, за исключением того, что это пахнет "домашней работой", и я не полностью доверяю коду, который нашел.)
Не забывайте, что большинство целых чисел имеют иррациональный квадратный корень...
вы ищете либо класс BigDecimal, либо просто нужны целые числа, чем BigInteger. Его произвольная точность, поэтому размер изменяется в зависимости от того, насколько велики числа, которые вы вводите
Чтобы найти квадратный корень из 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);
}