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

时间:2018-03-07 11:58:20

标签: java math catalan

无论我尝试了什么,下面的代码抛出ArithmeticException的消息“非终止十进制扩展;没有确切的可表示的十进制结果。”更大的数字(如43,50,56等)。

以下是代码:

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个数字上完美运行,但是当涉及到更高的值时,它会崩溃。

2 个答案:

答案 0 :(得分:2)

由于行

而发生异常
.divide(BigDecimal.valueOf(n).add(BigDecimal.ONE))

这里你没有给出一个精确的刻度,这意味着可以获得一个无限长的十进制扩展,例如将1除以3​​时。

要解决错误,您需要放入舍入比例和舍入模式。

E.g:

.divide(BigDecimal.valueOf(n).add(BigDecimal.ONE), 10, RoundingMode.HALF_UP)

答案 1 :(得分:1)

在这里使用BigDecimal没有帮助,你必须在进行乘法后执行除法,在这种情况下你的算法适用于BigInteger。