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

完善Java中findNPerfectNumbers方法以返回n个完全数的ArrayList

解决Java中找出n个完全数的问题

核心逻辑纠正与实现

首先,完全数的判断要避免冗余遍历:很多人会错误地遍历到目标数的前一位,其实只需遍历到目标数的平方根即可——因为约数是成对出现的,这样能大幅减少计算量。同时要注意排除自身,只累加除自身外的所有约数。

以下是完整的实现代码,包含findNPerfectNumbers方法和辅助判断的isPerfectNumber方法:

import java.util.ArrayList;

public class PerfectNumberFinder {
    public ArrayList<Integer> findNPerfectNumbers(int n) {
        ArrayList<Integer> perfectNumbers = new ArrayList<>();
        int currentNum = 2; // 从2开始排查,1不是完全数
        
        // 循环收集直到凑够n个完全数
        while (perfectNumbers.size() < n) {
            if (isPerfectNumber(currentNum)) {
                perfectNumbers.add(currentNum);
            }
            currentNum++;
        }
        
        return perfectNumbers;
    }
    
    // 辅助方法:判断一个数是否为完全数
    private boolean isPerfectNumber(int num) {
        if (num <= 1) {
            return false;
        }
        
        int divisorSum = 1; // 1是所有大于1的正整数的约数
        int sqrtNum = (int) Math.sqrt(num);
        
        // 遍历到平方根,成对累加约数
        for (int i = 2; i <= sqrtNum; i++) {
            if (num % i == 0) {
                divisorSum += i;
                // 避免平方数的约数重复累加(比如4的约数2,只加一次)
                if (i != num / i) {
                    divisorSum += num / i;
                }
            }
        }
        
        return divisorSum == num;
    }
}

关键细节说明

  • 约数求和优化:通过遍历到平方根,每找到一个约数i,就同时加上对应的成对约数num/i,避免了遍历到num-1的低效操作。
  • 收集逻辑:用while循环持续检查数字,直到列表中的完全数数量达到n,符合要求后直接返回该列表即可。
  • 边界处理:排除了小于等于1的数,因为这类数不可能是完全数;同时处理了平方数的约数重复问题,防止求和错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:21:57