是否有现成的Java库用于BigInteger和BigDecimal对象的操作?
我想使用平方根和++运算符。
谢谢
P.S。应该使用BigInteger.add()而不是++,我得到了它。 BigInteger的平方根怎么样?
答案 0 :(得分:2)
BigInteger 不可变。这使得像++
- 操作符这样的操作在概念上是不可能的。您无法更改给定BigInteger
的值,就像您无法使用String
一样。
您始终必须创建一个包含递增值的新BigInteger
(您当然可以将该BigInteger
的引用存储在同一个变量中)。
编辑:正如评论中所指出的,“递增”看起来像是:
BigInteger result = a.add(BigInteger.ONE);
或
a = a.add(BigInteger.ONE);
请注意,这两行都不会更改 BigInteger
最初指向的a
的值。最后一行创建了一个 new 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);
}
在Java中无法像 C ++ 那样重载运算符。