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);//求最大值与最小值的差值 start int cha = Subtract(a);//求最大值与最小值的差值 end cha=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************/ }