完善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
相关产品推荐
相关产品推荐

