计算加泰罗尼亚数字序列时出错

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。