数字黑洞
package 算法;/*任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:[82962, 75933, 63954, 61974]其中数字的先后顺序可以不考虑。 * */import java.util.Arrays;import java.util.HashSet;import java.util.Iterator;import java.util.Set;public class ShuZiHeiDong04 {static Set<Integer> set = new HashSet<Integer>();static Set<Integer> setArr = new HashSet<Integer>();static Set<Integer> setArrTemp = new HashSet<Integer>();static Set<Integer> set1 = new HashSet<Integer>();static Set<Integer> setArr1 = new HashSet<Integer>();static int[][] array = new int[20][20];static char[] charArray = new char[] {};static StringBuffer bf = new StringBuffer();public static void main(String[] args) {for (int i = 10000; i < 100000; i++) {//循环调用fx()fx(i, 0);//0表示一个计数器}setArr.remove(0);Iterator<Integer> it=setArr.iterator(); while(it.hasNext()){//上面的for循环后会得到一个包含所有圈的所有元素,并放到setArr(Set集合)中 fx2(it.next(),0); it=setArr.iterator(); }}/************ 求差运算 start************/public static int Subtract(int a){String str = String.valueOf(a);char[] array = str.toCharArray();Arrays.sort(array);String str1 = String.valueOf(array);StringBuffer bf = new StringBuffer();String str2 = bf.append(str1).reverse().toString();int min = Integer.parseInt(str1);int max = Integer.parseInt(str2);int cha = max - min;return cha;}/************ 求差运算 end ************//************ 判断差值是否小于1000 start ************/public static int JudgeSubtract(int cha,int a){String str = String.valueOf(a);if (cha < 10000) {String str3 = String.valueOf(cha);StringBuffer bff = new StringBuffer();int len = str.length();for (int i = 1; i <= 5 - len; i++)bff.append(0);bff.append(str3);cha = Integer.parseInt(bff.toString());}return cha;}/************ 判断差值是否小于1000 end ************/private static void fx2(int a, int count ){set1.add(a);setArr.remove(a);//此元素已经调用过fx,从setArr中删除++count;//计数器自加,当count的值大于set1.size()时说明已经进入 圈中if (count >set1.size()) {System.out.println(set1);set1.clear();return;}String str = String.valueOf(a);//求最大值与最小值的差值 startint cha = Subtract(a);//求最大值与最小值的差值 endcha=JudgeSubtract(cha,a);//判断差值是否小于5位数 start**********/fx2(cha, count);}/************函数fx start************/private static void fx(int a, int count) {String str = String.valueOf(a);int cha = Subtract(a);;set.add(cha);++count;if (count > set.size()) {setArr.add(cha);set.clear();return;}cha=JudgeSubtract(cha,a);fx(cha, count);}/************ 函数fx end************/}