BigIntegerнепреложный. Это делает что-то вроде ++
-оператор на нем концептуально невозможным. Вы не можете изменить значение заданного BigInteger
, как вы не можете сделать это с String
.
Приращение
Вы всегда должны создать новый BigInteger
, который содержит измененное значение (вы можете, конечно, сохранить ссылку на этот BigInteger
в одной и той же переменной).
Edit: Как было отмечено в комментарии, "Приращение" будет выглядеть следующим образом:
BigInteger result = a.add(BigInteger.ONE);
или
a = a.add(BigInteger.ONE);
Обратите внимание, что обе линии не Смените значение BigInteger
, который a
изначально указывает на. Последняя строка создает новый BigInteger и сохраняет ссылку на него в a
.
Расчет на площади
Вы можете вычислить квадрат BigInteger
как это:
BigInteger a = BigInteger.valueOf(2);
BigInteger a_square = a.multiply(a); // a^2 == a * a
или
BigInteger a_square = a.pow(2);
квадратный корень
Код взят из https://gist.github.com/JochemKuijpers/cd1ad9ec23d6d90959c549de5892d6cb. Он использует простую биссектрису и умную верхнюю границу. Обратите внимание, что a.shiftRight(x)
эквивалентно a/2^x
(только для неотрицательных чисел, но это все, что мы имеем дело с, во всяком случае)
BigInteger sqrt(BigInteger n) {
BigInteger a = BigInteger.ONE;
BigInteger b = n.shiftRight(5).add(BigInteger.valueOf(8));
while (b.compareTo(a) >= 0) {
BigInteger mid = a.add(b).shiftRight(1);
if (mid.multiply(mid).compareTo(n) > 0) {
b = mid.subtract(BigInteger.ONE);
} else {
a = mid.add(BigInteger.ONE);
}
}
return a.subtract(BigInteger.ONE);
}
Использование операторов Вместо методов
Оператор перегружать как в C++ не является возможно в Java.
Ну, вы изучили документацию для классов? – Kayaman
Да и, к сожалению, я не нашел ни слова о том, как получить квадрат от BigInteger – sunny
@sunny, если вы посмотрите на мой ответ, вы обнаружите, что нет необходимости в специальном методе 'square()'. Простое умножение выполняет задание. –