【发布时间】:2019-11-06 21:58:57
【问题描述】:
所以我需要在 Java 9 之前对 BigInteger 进行 sqrt,我发现下面的函数可以做到这一点。我确实理解代码,但我真的不明白为什么它在那里。所以我想我并没有真正理解它背后的数学原理。就像为什么使用 (n / 32 + 8) 一样。为什么 mid 是这样计算的。等等。
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);
}
【问题讨论】:
-
n/32+8是什么意思? -
@Adam 警告:至少票数最高的答案会返回一些小数字的错误值。见 cmets。
标签: java biginteger square-root