A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 七弦   /  2014-5-24 21:37  /  6717 人查看  /  26 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.util.*;

  2. /*
  3. 有些没弄完,输出有重复的。

  4. 引路深度,来确定运算层数。

  5. Td//
  6. */

  7. public class LoopQDemo2{
  8.         public static void main(String[] args){
  9.        
  10.                 //计算深度
  11.                 int depth =5;
  12.                
  13.                 //存放圈
  14.                 TreeSet<Integer> ts = new TreeSet<Integer>();
  15.                
  16.                
  17.                 for(int i=10000;i<=99999;i++){
  18.                         //每次都要清空
  19.                         ts.clear();
  20.                         //得到深度
  21.                         int count = depth;
  22.                        
  23.                         int num = i;
  24.                         //加入初始数
  25.                         ts.add(i);
  26.                        
  27.                         while(count>0){
  28.                                 //得到最大减最小的5位数
  29.                                 num = getFiveSize(getMax(num)-getMin(num));
  30.                                 if(i==num){
  31.                                         //在运算深度内,若开始循环就打印圈
  32.                                         sop(i+"------"+ts);
  33.                                 }else{
  34.                                         //否则继续,加入数
  35.                                         count--;
  36.                                         ts.add(num);
  37.                                 }
  38.                         }
  39.                        
  40.                 }
  41.         }

  42.         /*
  43.                 得到补齐的5位数
  44.         */
  45.         static int getFiveSize(Integer x){
  46.                 //变成字符数组起
  47.                 char []cx = x.toString().toCharArray();
  48.                 //不足5位
  49.                 if(cx.length<5){
  50.                         //后面加0
  51.                         return (int)Math.pow(10,5-cx.length)*new Integer(new String(cx));
  52.                 }
  53.                 return new Integer(new String(cx));
  54.         }
  55.         //得到最小的数
  56.         static int getMin(Integer x){
  57.                 char []cx = x.toString().toCharArray();
  58.                 //排序就好了, 你懂的
  59.                 Arrays.sort(cx);
  60.                 return new Integer(new String(cx));
  61.         }
  62.         //同上
  63.         static int getMax(Integer x){
  64.                 char []cx = x.toString().toCharArray();
  65.                 Arrays.sort(cx);
  66.                 for(int i = 0;i<cx.length/2;i++){
  67.                         char tmp = cx[i];
  68.                         cx[i]= cx[cx.length-1-i];
  69.                         cx[cx.length-1-i] = tmp;
  70.                 }
  71.                 return new Integer(new String(cx));
  72.         }
  73.         //你懂的
  74.         static void sop(Object o){
  75.                 System.out.println(o);
  76.         }
  77.        
  78.         /*
  79.                
  80.         static int isSame(Integer x1,Integer x2){
  81.                 char []cx1 = x1.toString().toCharArray();
  82.                 char []cx2 = x2.toString().toCharArray();
  83.                 Arrays.sort(cx1);
  84.                 Arrays.sort(cx2);
  85.                 return new String(cx1).compareTo(new String(cx2));
  86.         }
  87.         */
  88. }
复制代码


E:\Coder\cc>java LoopQDemo2
53955------[53955, 59994]
53955------[53955, 59994]
53955------[53955, 59994]
53955------[53955, 59994]
59994------[53955, 59994]
59994------[53955, 59994]
59994------[53955, 59994]
59994------[53955, 59994]
61974------[61974, 63954, 75933, 82962]
62964------[62964, 71973, 74943, 83952]
63954------[61974, 63954, 75933, 82962]
71973------[62964, 71973, 74943, 83952]
74943------[62964, 71973, 74943, 83952]
75933------[61974, 63954, 75933, 82962]
82962------[61974, 63954, 75933, 82962]
83952------[62964, 71973, 74943, 83952]

没有剔除重复的。。

将就看。。
回复 使用道具 举报
没有完美。。
回复 使用道具 举报
最终 我们都倒在了楼主的需求上....
回复 使用道具 举报
本帖最后由 七弦 于 2014-6-12 19:38 编辑

参考参考吧。

  1. import java.util.Arrays;
  2. public class MyTest10 {
  3.       public static void main(String args[])
  4.       {
  5.       
  6.            int f=Sort(array(34256));
  7.            int x=Sort(array(34256));
  8.            for(int i=0;i<4;i++) {      
  9.            x=Sort(array(x));
  10.                System.out.print(x+" ");
  11.            }
  12.       }
  13.       
  14.       static int []array(int n)
  15.       {
  16.              int a[]=new int[5];
  17.              int i=0;
  18.              int m=n;
  19.              while(i<5)
  20.              {
  21.                      a=m%10;
  22.                      if(m%10==0)
  23.                      a=0;
  24.                      m/=10;
  25.                            i++;
  26.              }
  27.              return a;
  28.       }
  29.       static int Sort(int a[]){
  30.              Arrays.sort(a);
  31.              String min="";
  32.              for(int i=0;i<5;i++)
  33.              {
  34.                    min=min+String.valueOf(a);
  35.              }
  36.              int Min=Integer.parseInt(min);
  37.              StringBuffer sb=new StringBuffer(min).reverse();
  38.              String max=new StringBuffer(sb).toString();
  39.              int Max=Integer.parseInt(max);
  40.              int c=Max-Min;
  41.              return c;
  42.        }
  43. }
复制代码


回复 使用道具 举报
godmmm 高级黑马 2014-12-28 23:02:41
25#
本帖最后由 godmmm 于 2014-12-28 23:06 编辑

花了3小时,时间有点长了,刚开始不相信答案,查了下baidu觉得差不多了!
大家给点意见!!!
  1. import java.io.FileWriter;
  2. import java.io.IOException;
  3. import java.util.*;

  4. /*数字黑洞:
  5. 有任意一个5位数,如:34256,
  6. 把它的各位数字打乱,重新排列,就可得到一个最大的数:65432,还有一个最小的数23456。
  7. 求这两个数字的差,得:41976,
  8. 然后把这个数字再次重复上述过程(如果不足5位,则前边补0)。
  9. 如此往复,数字会落入某个循环圈(称为数字黑洞)。
  10. 比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。

  11. 请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:
  12. [82962, 75933, 63954, 61974]
  13. 其中数字的先后顺序可以不考虑。*/

  14. /*思路: 1.遍历5位数
  15. *           2.对5位数进行排序,用StringBuilder的反转功能,Arrays的sort功能  获取最大值,最小值
  16. *           3.计算差值,将最大值添加到list集合,原理是:list集合出现过这个最大值就会落入这两个最大值之间的循环圈;
  17. *          4.用list集合存放最大值进行循环圈的判断,用set结合进行存放循环圈,由于第三部的算法,set集合去重复就简单了。
  18. *注意:其实每个数都要落入一个循环圈,每个数落入的循环圈可以看你c盘下生产的"c:/digitalBlackHole.txt"文件,就是有点大,小心死机额!!!
  19. */
  20. public class DigitalBlaceHole {
  21.         public static void main(String[] args) throws IOException
  22.         {
  23.                 ArrayList<String> al=new ArrayList<String>();//list排序后的每个最大数,
  24.                 TreeSet<String> ts=new TreeSet<String>();//set集合存放不相同的循环圈
  25.                 FileWriter fw=new FileWriter("c:/digitalBlackHole.txt");//存放每个数落入的循环圈
  26.                 findDigital(al,fw,ts);//调用方法
  27.                 for(String s:ts)//打印循环圈
  28.                 {
  29.                         System.out.println(s);
  30.                         
  31.                 }
  32.         }
  33.         public static void findDigital(ArrayList<String> al,FileWriter fw,TreeSet<String> ts) throws IOException
  34.         {
  35.                 for(int x=10000;x<100000;x++)//遍历
  36.                 {
  37.                         al.add("num:"+x);
  38.                         dudge(x,al,fw,ts);//判断方法
  39.                 }
  40.         }
  41.         private static void dudge(int num,ArrayList<String> al,FileWriter fw,TreeSet<String> ts) throws IOException {
  42.                 while(true)
  43.                 {
  44.                         StringBuilder sb=new StringBuilder();//建立字符串缓冲区
  45.                         char[] buf=(num+"").toCharArray();//获取数字对应的字符数组
  46.                         Arrays.sort(buf);//排序数组
  47.                         String min=new String(buf);//得到最小值
  48.                         String max=sb.append(min).reverse().toString();//得到最大值
  49.                         int mid=Integer.parseInt(max)-Integer.parseInt(min);//获取差值
  50.                         if (al.contains(max)) {//判断集合是否有这个最大数存在
  51.                                 int id=al.indexOf(max);//索引位置
  52.                                 fw.write(al.subList(id, al.size()).toString());//获取子list集合字符串兵写入文件
  53.                                 ts.add(al.subList(id, al.size()).toString());//获取子list集合字符串并存入set集合
  54.                                 al.clear();//清空集合,进行下次判断
  55.                                 break;
  56.                         /*} else if (mid <= 0 || max.equals(min)) {//这个有点多余了,主要是每个数都要落入循环
  57.                                 al.clear();
  58.                                 break;*/
  59.                         } else {
  60.                                 al.add(max);//没落入循环继续判断
  61.                                 //System.out.println(map);
  62.                                 dudge(mid,al,fw, ts);//递归
  63.                         }
  64.                         break;//最后断开
  65.                 }
  66.         }
  67. }
复制代码
运行结果:
[0]
[95553, 99954]
[96543, 97641, 98622, 97533]
[96642, 97731, 98532, 97443]
[97443, 96642, 97731, 98532]
[97533, 96543, 97641, 98622]
[97641, 98622, 97533, 96543]
[97731, 98532, 97443, 96642]
[98532, 97443, 96642, 97731]
[98622, 97533, 96543, 97641]
[99954, 95553]



回复 使用道具 举报
吊炸天的题目
回复 使用道具 举报
  1. import java.util.TreeSet;

  2. public class Test {

  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                 TreeSet<String> blackHoleList = BlackHole(0, 100000);
  6.                 // System.out.println(blackHoleList.size());
  7.                 for (String tree : blackHoleList) {
  8.                         System.out.println(tree);
  9.                 }
  10.         }

  11.         /**
  12.          * 输出一个储存数字黑洞TreeSet的ArrayList
  13.          *
  14.          * @param from
  15.          * @param end
  16.          * @return
  17.          */
  18.         public static TreeSet<String> BlackHole(int from, int end) {
  19.                 TreeSet<String> blackHoleList = new TreeSet<String>();
  20.                 // 建立一个角标从0-99999的boolean型数组
  21.                 boolean[] numList = new boolean[end];
  22.                 // 对数组进行遍历
  23.                 for (int i = from; i < numList.length; i++) {
  24.                         // 判断当前角标的数字是否已经在某个数字黑洞中
  25.                         if (numList[i]) {
  26.                                 continue;
  27.                         }
  28.                         // 建立储存数字黑洞的TreeSet
  29.                         TreeSet<Integer> numTemp = new TreeSet<Integer>();
  30.                         TreeSet<Integer> numTempArray = new TreeSet<Integer>();
  31.                         // 从大小为i的数字开始 计算其重组后的数的最大值和最小值的差值
  32.                         int reverseNum = i;

  33.                         int count = 0;
  34.                         // 通过while循环将遍历到的数及由其计算出的差值数存入一个TreeSet中
  35.                         while (count < numTemp.size() * 2 + 1) {
  36.                                 // 当再次向numTemp树中存入已有的数时返回false,于是进入if区域内,将该值存入numTempArray这个TreeSet中
  37.                                 if (!numTemp.add(reverseNum)) {
  38.                                         numTempArray.add(reverseNum);
  39.                                 }
  40.                                 // 记录该值已经遍历过
  41.                                 numList[reverseNum] = true;
  42.                                 // 获取其差值数
  43.                                 reverseNum = cutNum(reverseNum);
  44.                                 count++;
  45.                         }

  46.                         blackHoleList.add(numTempArray.toString());

  47.                 }
  48.                 return blackHoleList;
  49.         }

  50.         /**
  51.          * 输入一个数输出重组后的数的最大值和最小值的差值
  52.          *
  53.          * @param num
  54.          * @return
  55.          */
  56.         public static int cutNum(int num) {
  57.                 String[] numStrList = Integer.toString(num).split("");
  58.                 int[] numHash = new int[10];
  59.                 for (int j = 1; j < numStrList.length; j++) {
  60.                         numHash[Integer.parseInt(numStrList[j])]++;
  61.                 }
  62.                 int numBiggest, numSmallest;
  63.                 StringBuilder numString = new StringBuilder();
  64.                 for (int i = 0; i < numHash.length; i++) {
  65.                         for (int k = 0; k < numHash[i]; k++) {
  66.                                 numString.append(i);
  67.                         }
  68.                 }
  69.                 numSmallest = Integer.parseInt(numString.toString());
  70.                 numBiggest = Integer.parseInt(numString.reverse().toString());
  71.                 return numBiggest - numSmallest;

  72.         }
  73. }
复制代码
[0]
[495]
[53955, 59994]
[6174]
[61974, 63954, 75933, 82962]
[62964, 71973, 74943, 83952]

小于5位数的结果在输出时做个判断就OK,懒得弄了。

回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 加入黑马