如何用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

