计算加泰罗尼亚数字序列时出错
Error while calculating Catalan number sequence
无论我尝试什么,下面的代码都会在更大的数字(如 43、50、56 等)上抛出 ArithmeticException
和消息 "Non-terminating decimal expansion; no exact representable decimal result."。
代码如下:
private BigDecimal catalan(int n) {
if (n <= 1) {
return BigInteger.ONE;
}
return BigDecimal.valueOf(4)
.multiply(BigDecimal.valueOf(n))
.subtract(BigDecimal.valueOf(2))
.divide(BigDecimal.valueOf(n).add(BigDecimal.ONE))
.multiply(new BigDecimal(catalan(n - 1)));
}
此方法在小 n
数字上完美运行,但当涉及到更高的值时它会崩溃。
异常是因为行
.divide(BigDecimal.valueOf(n).add(BigDecimal.ONE))
这里你没有给出精确的刻度,这意味着可以得到无限长的小数展开,例如当1除以3时。
要解决错误,您需要输入舍入比例和舍入模式。
例如:
.divide(BigDecimal.valueOf(n).add(BigDecimal.ONE), 10, RoundingMode.HALF_UP)
在这里使用 BigDecimal 没有帮助,您必须在乘法之后执行除法,在这种情况下,您的算法适用于 BigInteger。
无论我尝试什么,下面的代码都会在更大的数字(如 43、50、56 等)上抛出 ArithmeticException
和消息 "Non-terminating decimal expansion; no exact representable decimal result."。
代码如下:
private BigDecimal catalan(int n) {
if (n <= 1) {
return BigInteger.ONE;
}
return BigDecimal.valueOf(4)
.multiply(BigDecimal.valueOf(n))
.subtract(BigDecimal.valueOf(2))
.divide(BigDecimal.valueOf(n).add(BigDecimal.ONE))
.multiply(new BigDecimal(catalan(n - 1)));
}
此方法在小 n
数字上完美运行,但当涉及到更高的值时它会崩溃。
异常是因为行
.divide(BigDecimal.valueOf(n).add(BigDecimal.ONE))
这里你没有给出精确的刻度,这意味着可以得到无限长的小数展开,例如当1除以3时。
要解决错误,您需要输入舍入比例和舍入模式。
例如:
.divide(BigDecimal.valueOf(n).add(BigDecimal.ONE), 10, RoundingMode.HALF_UP)
在这里使用 BigDecimal 没有帮助,您必须在乘法之后执行除法,在这种情况下,您的算法适用于 BigInteger。