1 public Class Test{
2 /**
3 * 恒生2020春招开发笔试题(编程题):
4 * 一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.
5 * 编程出1000以内的所有完数。
6 * 思路:寻找其所有的因数
7 * @params: [num] 输入的数字范围
8 * @return: java.util.Set<java.lang.Integer> 返回1000以内的所有完数。
9 */
10 public static Set<Integer> perfectNumber(int num){
11 int currentNum = 0;//当前拆分的数字
12 Set<Integer> perfectNumber = new HashSet<>();
13 if (num <=1) {
14 return perfectNumber;
15 }
16 for (int j = 2 ; j <= num ; j++){//1000之内的数字
17 currentNum = j;//用于拆分
18 Set<Integer> factors = new HashSet<>();//数字的全部因子
19 factors.add(1);//1是每个数字都会有的因子
20 //每个数字因子拆分
21 System.out.println();
22 System.out.println("currentNum = " + currentNum);
23 for (int i = 2; i <= j ; i++){
24 //因子拆分
25 System.out.print("i = "+ i + "/");
26 if (currentNum % i == 0){
27 factors.add(i);//因子
28 factors.add(j/currentNum);//拆分的搭配因子
29 }
30 }
31 //排除自身因子
32 factors.remove(j);
33 //统计因子和
34 int sum = 0;
35 for (Integer factor : factors) {
36 sum += factor;
37 }
38 System.out.println();
39 System.out.println("sum = " + sum);
40 Object[] objects = factors.toArray();
41 Arrays.sort(objects);//数组排序
42 System.out.println(Arrays.toString(objects));
43 //判断是否为完数
44 if (sum == j){
45 perfectNumber.add(j);
46 }
47 }
48 return perfectNumber;
49 }
50 public static void main(String[] args) {
51 Set<Integer> set = perfectNumber(1000);
52 System.out.println();
53 Object[] objects = set.toArray();
54 Arrays.sort(objects);
55 System.out.println("完数:" + Arrays.toString(objects));//完数:[6, 28, 496]
56 }
57 }
修改了部分判断逻辑,已经校准。