演算法筆記_217:黑洞數(Java)

weixin_33896726發表於2017-05-22

目錄

1 問題描述

2 解決方案

 


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]

 

相關文章