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

范围完美数检测循环执行异常,单独检测逻辑正常,求问题排查

问题分析与解决

嘿,我一眼就发现问题所在啦!你的核心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释放资源
    }
}

额外小建议

  1. 我调整了条件判断的顺序,先处理n==0的特殊情况,避免后面的判断出现冗余;
  2. 记得用完Scanner后调用s.close(),养成良好的资源回收习惯;
  3. 如果想优化性能,可以把因数循环的上限改成i <= Math.sqrt(n)——找到一个因数i时,同时把n/i也加入sum(注意避免重复加平方数的情况),能大幅减少循环次数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:56:52