范围完美数检测循环执行异常,单独检测逻辑正常,求问题排查
问题分析与解决
嘿,我一眼就发现问题所在啦!你的核心bug出在**sum变量没有在每次检测新数字时重置为0**——这直接导致后续数字的因数和计算是累加了之前所有数字的因数和,完全偏离了预期结果!
具体原因
你在代码开头只初始化了一次int sum = 0;,但在while循环的每一轮迭代(也就是检测每个新数字)时,没有把sum重新置为0。比如:
- 检测第一个数字时,sum的计算是正确的;
- 当
n++后检测第二个数字时,sum还是第一个数字的因数和,然后继续累加第二个数字的因数,结果完全错误; - 以此类推,后面所有的判断都会因为sum的值不对而失效。
修正后的代码
只需要把sum的初始化放到while循环内部,或者在每次循环开始时重置sum = 0即可:
import java.util.Scanner; public class CodingChallenge3 { public static void main(String[] args) { int n; Scanner s = new Scanner(System.in); System.out.print("Welcome to the Perfect Number Tester." + "\n" + "Enter a number range." + "\n" + "From: "); n = s.nextInt(); System.out.print("To: "); int endNum = s.nextInt(); while (n <= endNum) { // 关键:每次检测新数字时,重置sum为0 int sum = 0; for (int i = 1; i < n; i++) { if (n % i == 0) { sum = sum + i; } } // 调整判断顺序,避免逻辑冗余 if (n == 0) { System.out.println(n + " has no factors"); } else if (sum == n) { System.out.println(n + " is perfect"); } else if (sum > n) { System.out.println(n + " is imperfect abundant"); } else { System.out.println(n + " is imperfect deficient"); } n++; } s.close(); // 别忘了关闭Scanner释放资源 } }
额外小建议
- 我调整了条件判断的顺序,先处理
n==0的特殊情况,避免后面的判断出现冗余; - 记得用完Scanner后调用
s.close(),养成良好的资源回收习惯; - 如果想优化性能,可以把因数循环的上限改成
i <= Math.sqrt(n)——找到一个因数i时,同时把n/i也加入sum(注意避免重复加平方数的情况),能大幅减少循环次数。
内容的提问来源于stack exchange,提问作者Irena Rich
相关产品推荐
相关产品推荐

