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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小歪 中级黑马   /  2014-6-8 22:13  /  1485 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

题目:

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


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

我不是要这道题的答案,因为已经通过其他方法解决了,但是在做这道题时,遇到了以下小小的问题,希望大神们认真看完,帮我解决我的疑惑!

以下只是对82962这个循环圈做测试:


  1. [size=3]package ClassPackage;


  2. import java.util.Iterator;
  3. import java.util.TreeSet;


  4. public class Test37 {
  5.         public static void main(String args[])
  6.         {
  7.                 TreeSet<Integer> circle=null;;
  8.                 int num=82962;

  9.        
  10.                         circle=new TreeSet<Integer>(new PrimaryOrder());       

  11.                         //调用递归方法
  12.                         circle=FoundCircle(num,circle);
  13.                        
  14.                          //输出循环圈
  15.                         if(circle!=null){
  16.                                 Iterator<Integer> iter=circle.iterator();
  17.                                 System.out.print("[");
  18.                                 while(iter.hasNext()){
  19.                                         System.out.print(iter.next()+"  ");
  20.                                 }
  21.                                 System.out.print("]");
  22.                         }

  23.         }

  24.        
  25.         public static TreeSet<Integer> FoundCircle(int temp,TreeSet<Integer> circle){
  26.        
  27.                 System.out.print("添加::"+temp);
  28.                 if(circle.add(temp)){        //诺传入的值还可添加到TreeSet集合,表示此时还未到循环尾
  29.                         System.out.println("::成功");
  30.                        
  31.                         //获得排序最大值
  32.                         int max=0;
  33.                         if(( max=sortNumMax(temp))==0) return null;
  34.                         System.out.println("max::"+max);               
  35.                        
  36.                         //反转获得最小值,并计算差值
  37.                         temp=max-Integer.parseInt(new StringBuffer(max+"").reverse().toString());//反转,即最大值减最小值
  38.                        
  39.                         //将差值继续递归
  40.                         return circle=FoundCircle(temp,circle);
  41.                 }else{
  42.                         System.out.println("::失败");
  43.                         return circle;
  44.                         }
  45.         }
  46.        
  47.         //此方法只是将传入的数字组成最大值返回
  48.         public static int sortNumMax(int n){
  49.                 int num[] ={0,0,0,0,0};
  50.                 int i=0;
  51.                 //拆分
  52.                 while(n%10!=0){               
  53.                         num[i]=n%10;
  54.                         i++;
  55.                         n/=10;
  56.                 }
  57.                
  58.                 if(num[0]-num[1]-num[2]-num[3]-num[4]==0) //如果5位数都相同 不考虑
  59.                 {
  60.                         return 0;
  61.                 }
  62.                
  63.                 //排序
  64.                 int temp=0;
  65.                 for(int j=0;j<4;j++){
  66.                         for(int k=j+1;k<5;k++){
  67.                                 if(num[j]>num[k]){
  68.                                         temp=num[j];
  69.                                         num[j]=num[k];
  70.                                         num[k]=temp;
  71.                                 }
  72.                         }
  73.                 }
  74.                        
  75.                 return num[4]*10000+num[3]*1000+num[2]*100+num[1]*10+num[0];
  76.         }
  77. }

  78. class PrimaryOrder implements Comparator<Object>   //排序种子文件,改变[/size][size=3]TreeSet[/size]的排序数序,[size=3]保持原来的顺序
  79. {
  80.         public int compare(Object o1,Object o2)
  81.         {
  82.                
  83.                 Integer i1=(Integer)o1;
  84.                 Integer i2=(Integer)o2;
  85.                 if(i2.equals(i1))return 0;
  86.                
  87.                 return 1;
  88.         }
  89. }[/size]
复制代码
上面这组测试数据,运行后却在最后添加了一个重复数值,这里就纳闷了,为何这个值添加到集合当中去了:




究竟是哪里出了问题?


评分

参与人数 1技术分 +2 收起 理由
轻语。 + 2 神马都是浮云

查看全部评分

3 个回复

倒序浏览
代码太多没看,改了下这个,好像没问题了,至于为什么我也不知道
Integer i1=(Integer)o1;
Integer i2=(Integer)o2;               
return i1.compareTo(i2);
回复 使用道具 举报 1 0
谭荣强 发表于 2014-6-9 01:32
代码太多没看,改了下这个,好像没问题了,至于为什么我也不知道
Integer i1=(Integer)o1;
Integer i2=(Inte ...

的确何事了...
回复 使用道具 举报

我写的比较方法为什么会出现这种情况呢?:Q
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马