编程题:一个数如果恰好等于它的因子之和,这个数就称为 "完数 "。例如6=1+2+3.编程 找出1000以内的所有完数。

 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 }

 

修改了部分判断逻辑,已经校准。
posted @ 2020-10-08 14:28  就从新的开始  阅读(1813)  评论(3)    收藏  举报