import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Test {
/**
* 任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:
* 41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
* 比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
* 请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。
* [53955,59994] [61974,82962,75933,63954] [62964,71973,83952,74943]
*/
public static void main(String[] args) {
// 定义一个嵌套集合存所有的数字黑洞
List<List<Integer>> list_list = new ArrayList<>();
for (int i = 10000; i < 100000; i++) {
// 把数字黑洞从返回的集合中分离出来,并存到另一个集合中
ArrayList<Integer> list = getList(new ArrayList<Integer>(), i);
List<Integer> temp = new ArrayList<>();
// 因为返回集合的最后一个元素就是这个数字黑洞的开始数字,倒数第二个元素就是这个数字黑洞的结束数字,通过截取获得数字黑洞
temp.addAll(list.subList(list.indexOf(list.get(list.size() - 1)),
list.size() - 1));
// 如果嵌套集合没包含这个数字黑洞就存储
if (!list_list.contains(temp)) {
list_list.add(temp);
}
}
// 得到的数字黑洞因为排序不一样会被认为是不同的集合,所有再去一次重复
for (int i = 0; i < list_list.size() - 1; i++) {
for (int j = i + 1; j < list_list.size(); j++) {
if (list_list.get(i).containsAll(list_list.get(j))) {
list_list.remove(j--);
}
}
}
// 遍历所有的数字黑洞
for (List<Integer> arrayList : list_list) {
System.out.println(arrayList);
}
}
// 获取每一个5位数的数字黑洞,并存在一个ArrayList<Integer>集合中
public static ArrayList<Integer> getList(ArrayList<Integer> list, int a) {
// 获取每一个相减后的结果
Integer result = getResult(a);
// 如果集合中没有相减后的结果这个元素,则把结果添加到集合中,并递归调用
if (!list.contains(result)) {
list.add(result);
getList(list, result);
// 如果集合中有了相减后的结果这个元素,说明这个数字黑洞开始了下一轮循环,
// 此时相减后的结果是这个数字黑洞的开始,并且把这个开始的数字存在集合末尾
} else {
list.add(result);
}
// 返回带有数字黑洞的集合
return list;
}
// 获取最大数和最小数的差
public static Integer getResult(Integer b) {
char[] arr = String.valueOf(b).toCharArray();
// 如果是4位数加1个0
if (arr.length == 4) {
String str = "0" + String.valueOf(b);
arr = str.toCharArray();
// 如果是3位数加2个0
} else if (arr.length == 3) {
String str = "00" + String.valueOf(b);
arr = str.toCharArray();
// 如果是2位数加3个0
} else if (arr.length == 2) {
String str = "000" + String.valueOf(b);
arr = str.toCharArray();
// 如果是1位数加4个0
} else if (arr.length == 1) {
String str = "0000" + String.valueOf(b);
arr = str.toCharArray();
}
// 排序后会得到最小数的字符串表示形式
Arrays.sort(arr);
// 把字符串转成Integer对象
Integer min = Integer.parseInt(String.valueOf(arr));
// 反转后会得到最大数的字符串表示形式,再把字符串转成Integer对象
Integer max = Integer.parseInt(new StringBuilder(String.valueOf(arr))
.reverse().toString());
// 返回相减后的结果
Integer result = max - min;
return result;
}
} |