任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432, 一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,


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

请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。

循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]

其中数字的先后顺序可以不考虑。

 */
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class 数字黑洞 {
	 static Set<List
  
  
   
   > set = new HashSet<List
   
   
    
    >();
	 static int start = 0;
	public static void main(String[] args) {
		List
    
    
     
      list = new ArrayList
     
     
      
      (0);
		for (int i = 10000; i < 100000; i++) {
			if (i % 11111 == 0) {
				continue;
			} else {
				检测循环圈(i, list);
			}
		}
		print();
		
	}

	private static void print() {
		Iterator<List
      
      
        > it = set.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } private static void 检测循环圈(int n, List 
       
         list) { String s = n+""; char[] c = s.toCharArray(); int a = max(c); int b = min(c); int d = a -b ; if(寻找循环圈(d,list)){ List 
        
          temp = new ArrayList 
         
           (); temp.addAll(list.subList(start, list.size())); if(!contains(temp)&&temp.get(0)!=0){ set.add(temp); } list.clear(); return ; } list.add(d); 检测循环圈(d,list); } //去重 private static boolean contains(List 
          
            temp) { boolean flag = false; Iterator<List 
           
             > it = set.iterator(); while(it.hasNext()){ if(it.next().containsAll(temp)){ flag = true; break; } } return flag; } private static boolean 寻找循环圈(int n, List 
            
              list) { for(int i = 0;i<list.size();i++){ if(list.get(i)==n){ start = i; return true; } } return false; } //计算最小的数字 private static int min(char[] c) { Arrays.sort(c); StringBuffer sb = new StringBuffer(String.valueOf(c)); return Integer.parseInt(sb.toString()); } //计算最大的数字 private static int max(char[] c) { Arrays.sort(c); StringBuffer sb = new StringBuffer(String.valueOf(c)); return Integer.parseInt(sb.reverse().toString()); } } 运行结果: [63954, 61974, 82962, 75933] [74943, 62964, 71973, 83952] [53955, 59994] 
             
            
           
          
         
        
      
     
     
    
    
   
   
  
  

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值