You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用BigInteger计算两边界间非边界数字和?代码现无限循环与累加失效

解决BigInteger累加的无限循环与值不更新问题

你遇到的两个问题——无限循环和total始终为0,根源其实都是同一个:BigInteger是不可变类,它的所有修改方法都不会改变原对象,而是返回一个全新的实例。咱们逐个拆解并修复:

1. total始终显示0的原因与修复

你现在写的total.add(startingBoundary)只是计算了新的和,但没有把这个新值赋值回total变量。因为BigInteger的不可变性,原total对象还是初始的BigInteger("0"),自然每次打印都是0。

修复方式:把累加语句改成赋值形式,接收add方法返回的新实例:

total = total.add(startingBoundary);

2. 无限循环的原因与修复

同样的问题出现在startingBoundary.add(new BigInteger("1"))——这条语句只是生成了一个"原数+1"的新BigInteger,但没有赋值回startingBoundary变量。你的startingBoundary永远停留在初始值,循环条件startingBoundary.compareTo(finishingBoundary) != 0永远成立,自然陷入死循环。

修复方式:同样把递增语句改成赋值形式,还可以用更简洁的常量替代手动创建的BigInteger("1"):

startingBoundary = startingBoundary.add(BigInteger.ONE);

3. 额外优化:修正非边界求和逻辑+简化代码

除了上面两个bug,原代码还有个逻辑小问题:它会把边界值也加入求和(比如调用addNumbers("5","8")会累加5、6、7),但你的需求是非边界数字的和(只算6+7)。另外,初始的if-else重复创建了BigInteger对象,也可以简化。

这里给你一份完整的修正代码:

public static BigInteger addNumbers(String from, String to) {
    BigInteger total = BigInteger.ZERO;
    BigInteger start = new BigInteger(from);
    BigInteger end = new BigInteger(to);
    
    // 确保start是较小值,end是较大值,避免重复实例化
    if (start.compareTo(end) > 0) {
        BigInteger temp = start;
        start = end;
        end = temp;
    }
    
    // 跳过左边界,从start+1开始累加,直到接近右边界
    start = start.add(BigInteger.ONE);
    while (start.compareTo(end) < 0) {
        total = total.add(start);
        start = start.add(BigInteger.ONE);
    }
    
    return total;
}

测试addNumbers("5", "8")时,start会从6开始,累加6和7后,start变成8,此时8.compareTo(8) < 0不成立,循环结束,返回13,完全符合你的需求。

内容的提问来源于stack exchange,提问作者eghe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:28:52