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

编写程序输出2-20000间完全数,仅输出6,求问题排查

完全数程序问题分析与修复

代码里的关键错误

  • for循环条件逻辑错误:你写的for(int sum = 0; number % factorNum == 0; factorNum++),这个条件会让循环只在number能被factorNum整除时继续。但完全数需要检查所有小于自身的正整数是否为因数,而不是只遍历能整除的数。比如处理28时,factorNum到3就会因为28%3≠0直接终止循环,根本没机会处理4、7这些关键因数。
  • sum初始化位置错误:sum在for循环内部初始化,每次循环迭代都会重置为0,导致因数累加完全失效。必须把sum的初始化移到for循环外面,确保每个待检查的number只初始化一次sum。
  • 完全数判断时机错误:你每次加完一个因数就判断number == sum,这只会在刚好累加后等于的情况(比如6)触发输出,其他完全数还没加完所有因数就被循环终止了。正确做法是等所有因数遍历完成后,再做判断。
  • 语法疏漏:++number后面少了分号;,这会导致编译报错,你能运行可能是输入代码时的疏忽。
  • 参数类型错误:主方法参数应该是String[] args,不是System[] args,这同样会导致编译问题。

修复后的基础版本代码

public static void partC(String[] args) {
    int number = 2;
    
    while(number <= 20000){
        int sum = 0;
        int factorNum = 1;
        
        // 遍历所有小于当前number的正整数
        for(; factorNum < number; factorNum++){
            if(number % factorNum == 0){
                sum += factorNum;
            }
        }
        
        // 遍历完所有因数后判断是否为完全数
        if(number == sum){
            System.out.println(number);
        }
        number++;
    }
}

可选效率优化版本

如果想提升程序运行速度,可以把因数遍历的上限改成Math.sqrt(number),减少循环次数:

public static void partC(String[] args) {
    int number = 2;
    
    while(number <= 20000){
        int sum = 1; // 1是所有大于1的数的因数,先提前累加
        int factorNum = 2;
        int sqrt = (int)Math.sqrt(number);
        
        for(; factorNum <= sqrt; factorNum++){
            if(number % factorNum == 0){
                sum += factorNum;
                // 避免平方数的平方根被重复累加
                if(factorNum != number / factorNum){
                    sum += number / factorNum;
                }
            }
        }
        
        if(number == sum){
            System.out.println(number);
        }
        number++;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:18:21