Я использую java и имею дело с числами, превышающими long (64 бита). Что мне использовать? Каков размер BigInteger в Java?
Большие числа, требующие более 64-битного представления
Ответы (5)
Как вы упомянули в своем вопросе, вам следует использовать BigInteger.
Они могут быть сколь угодно большими - до тех пор, пока у вас не закончится память.
Каков размер BigInteger в Java?
Это немного сложно. Проблема в том, что в документации javadoc нет четкой спецификации ограничения.
Класс использует
int[]
для представления величины. Это означает, что он потенциально может представлять числа до((2^32)^(2^31 - 1)
.В API есть метод, который возвращает число в виде массива байтов с дополнением до двух. Предел для этого составляет
((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);
}
import java.util.Scanner; импорт java.math.BigDecimal;
public class Ha40 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
long d=scan.nextLong();
String st=" ";
st=scan.next();
st+= scan.nextLine();
// Write your code here.
System.out.println("String: " + st);
System.out.println("Double: " + d);
System.out.println("Int: " + i);
}
}
ввод: 2147483647 235345345345.234534 fsdfsdf sdf, но ans не достигает отметки