目錄
1 問題描述
任意一個5位數,比如:34256,把它的各位數字打亂,重新排列,可以得到一個最大的數:65432,一個最小的數23456。求這兩個數字的差,得:41976,把這個數字再次重複上述過程(如果不足5位,則前邊補0)。如此往復,數字會落入某個迴圈圈(稱為數字黑洞)。
比如,剛才的數字會落入:[82962, 75933, 63954, 61974] 這個迴圈圈。
請編寫程式,找到5位數所有可能的迴圈圈,並輸出,每個迴圈圈佔1行。其中5位數全都相同則迴圈圈為 [0],這個可以不考慮。
迴圈圈的輸出格式仿照:
[82962, 75933, 63954, 61974]
其中數字的先後順序可以不考慮。
2 解決方案
1 import java.util.ArrayList; 2 import java.util.Arrays; 3 import java.util.Collections; 4 import java.util.HashSet; 5 6 7 public class Main { 8 public static HashSet<ArrayList<Integer>> set = new HashSet<ArrayList<Integer>>(); 9 public static int start; 10 11 public String getMax(int n) { 12 StringBuffer s = new StringBuffer(""); 13 String temp = "" + n; 14 if(temp.length() < 5) { 15 while(temp.length() < 5) { 16 temp = "0" + temp; 17 } 18 } 19 char[] arrayN = temp.toCharArray(); 20 Arrays.sort(arrayN); 21 for(int i = arrayN.length - 1;i >= 0;i--) 22 s.append(arrayN[i]); 23 return s.toString(); 24 } 25 26 public String getMin(int n) { 27 String temp = getMax(n); 28 StringBuffer s = new StringBuffer(temp); 29 return s.reverse().toString(); 30 } 31 32 public int getResult(int n) { 33 int max = Integer.valueOf(getMax(n)); 34 int min = Integer.valueOf(getMin(n)); 35 return max - min; 36 } 37 38 public static void main(String[] args) { 39 Main test = new Main(); 40 for(int i = 10000;i < 100000;i++) { 41 if(i % 11111 == 0) 42 continue; 43 ArrayList<Integer> list = new ArrayList<Integer>(); 44 int a = i; 45 while(true) { 46 a = test.getResult(a); 47 if(!list.contains(a)) 48 list.add(a); 49 else 50 break; 51 } 52 start = list.indexOf(a); 53 ArrayList<Integer> temp = new ArrayList<Integer>(); 54 for(int j = start;j < list.size();j++) 55 temp.add(list.get(j)); 56 Collections.sort(temp); 57 set.add(temp); 58 } 59 for(ArrayList<Integer> list : set) 60 System.out.println(list); 61 } 62 }
執行結果:
[62964, 71973, 74943, 83952] [53955, 59994] [61974, 63954, 75933, 82962]