题目:
有任意一个5位数,如:34256,
把它的各位数字打乱,重新排列,就可得到一个最大的数:65432,还有一个最小的数23456。
求这两个数字的差,得:41976,
然后把这个数字再次重复上述过程(如果不足5位,则前边补0)。
如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。
其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]
其中数字的先后顺序可以不考虑。
我不是要这道题的答案,因为已经通过其他方法解决了,但是在做这道题时,遇到了以下小小的问题,希望大神们认真看完,帮我解决我的疑惑!
以下只是对82962这个循环圈做测试:
- [size=3]package ClassPackage;
- import java.util.Iterator;
- import java.util.TreeSet;
- public class Test37 {
- public static void main(String args[])
- {
- TreeSet<Integer> circle=null;;
- int num=82962;
-
- circle=new TreeSet<Integer>(new PrimaryOrder());
- //调用递归方法
- circle=FoundCircle(num,circle);
-
- //输出循环圈
- if(circle!=null){
- Iterator<Integer> iter=circle.iterator();
- System.out.print("[");
- while(iter.hasNext()){
- System.out.print(iter.next()+" ");
- }
- System.out.print("]");
- }
- }
-
- public static TreeSet<Integer> FoundCircle(int temp,TreeSet<Integer> circle){
-
- System.out.print("添加::"+temp);
- if(circle.add(temp)){ //诺传入的值还可添加到TreeSet集合,表示此时还未到循环尾
- System.out.println("::成功");
-
- //获得排序最大值
- int max=0;
- if(( max=sortNumMax(temp))==0) return null;
- System.out.println("max::"+max);
-
- //反转获得最小值,并计算差值
- temp=max-Integer.parseInt(new StringBuffer(max+"").reverse().toString());//反转,即最大值减最小值
-
- //将差值继续递归
- return circle=FoundCircle(temp,circle);
- }else{
- System.out.println("::失败");
- return circle;
- }
- }
-
- //此方法只是将传入的数字组成最大值返回
- public static int sortNumMax(int n){
- int num[] ={0,0,0,0,0};
- int i=0;
- //拆分
- while(n%10!=0){
- num[i]=n%10;
- i++;
- n/=10;
- }
-
- if(num[0]-num[1]-num[2]-num[3]-num[4]==0) //如果5位数都相同 不考虑
- {
- return 0;
- }
-
- //排序
- int temp=0;
- for(int j=0;j<4;j++){
- for(int k=j+1;k<5;k++){
- if(num[j]>num[k]){
- temp=num[j];
- num[j]=num[k];
- num[k]=temp;
- }
- }
- }
-
- return num[4]*10000+num[3]*1000+num[2]*100+num[1]*10+num[0];
- }
- }
- class PrimaryOrder implements Comparator<Object> //排序种子文件,改变[/size][size=3]TreeSet[/size]的排序数序,[size=3]保持原来的顺序
- {
- public int compare(Object o1,Object o2)
- {
-
- Integer i1=(Integer)o1;
- Integer i2=(Integer)o2;
- if(i2.equals(i1))return 0;
-
- return 1;
- }
- }[/size]
复制代码 上面这组测试数据,运行后却在最后添加了一个重复数值,这里就纳闷了,为何这个值添加到集合当中去了:
究竟是哪里出了问题?
|