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 }
修改了部分判断逻辑,已经校准。