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 }
修改了部分判斷邏輯,已經校准。