黑洞数

任意一个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.Set;

/**
 * 
 * @author «ÿ’‹
 *
 */
public class HeiDong {

	//—≠ª∑»¶÷–µƒÀ˘”– ˝
	static Set<String> xhq = new HashSet<String>();
	static ArrayList al;
	static Set<String> set;
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(int i=10000; i<100000; i++) {
			al = new ArrayList();
			set = new HashSet<String>();
			int n = getMaxSubMin(i);
			if(n == 0) {
				ArrayList al_xhq = new ArrayList();
				int max = al.size() - 1;
				String s = (String) al.get(max);
				al_xhq.add(s);
				xhq.add(s);
				while(true){
					max--;
					if(al.get(max).equals(s)) break;
					al_xhq.add(1, al.get(max));
					xhq.add((String) al.get(max));
				}
				System.out.println(al_xhq);
			}
		}
	}

	/**
	 * 
	 */
	public static int getMaxSubMin(int n) {
		if(xhq.contains(n+"")) return -1;
		al.add(n+"");
		if(set.add(n+"")) {
			int[] a = new int[5];
			a[0] = n / 10000;
			a[1] = n / 1000 % 10;
			a[2] = n / 100 % 10;
			a[3] = n / 10 % 10;
			a[4] = n % 10;
			Arrays.sort(a);
			int m = (a[4]-a[0])*10000 + (a[3]-a[1])*1000 + (a[1]-a[3])*10 + (a[0]-a[4]);
			return getMaxSubMin(m);
		}
		else return 0;		
	}
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值