本帖最后由 godmmm 于 2014-12-28 23:06 编辑
花了3小时,时间有点长了,刚开始不相信答案,查了下baidu觉得差不多了!
大家给点意见!!!
- import java.io.FileWriter;
- import java.io.IOException;
- import java.util.*;
- /*数字黑洞:
- 有任意一个5位数,如:34256,
- 把它的各位数字打乱,重新排列,就可得到一个最大的数:65432,还有一个最小的数23456。
- 求这两个数字的差,得:41976,
- 然后把这个数字再次重复上述过程(如果不足5位,则前边补0)。
- 如此往复,数字会落入某个循环圈(称为数字黑洞)。
- 比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
-
- 请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:
- [82962, 75933, 63954, 61974]
- 其中数字的先后顺序可以不考虑。*/
-
- /*思路: 1.遍历5位数
- * 2.对5位数进行排序,用StringBuilder的反转功能,Arrays的sort功能 获取最大值,最小值
- * 3.计算差值,将最大值添加到list集合,原理是:list集合出现过这个最大值就会落入这两个最大值之间的循环圈;
- * 4.用list集合存放最大值进行循环圈的判断,用set结合进行存放循环圈,由于第三部的算法,set集合去重复就简单了。
- *注意:其实每个数都要落入一个循环圈,每个数落入的循环圈可以看你c盘下生产的"c:/digitalBlackHole.txt"文件,就是有点大,小心死机额!!!
- */
- public class DigitalBlaceHole {
- public static void main(String[] args) throws IOException
- {
- ArrayList<String> al=new ArrayList<String>();//list排序后的每个最大数,
- TreeSet<String> ts=new TreeSet<String>();//set集合存放不相同的循环圈
- FileWriter fw=new FileWriter("c:/digitalBlackHole.txt");//存放每个数落入的循环圈
- findDigital(al,fw,ts);//调用方法
- for(String s:ts)//打印循环圈
- {
- System.out.println(s);
-
- }
- }
- public static void findDigital(ArrayList<String> al,FileWriter fw,TreeSet<String> ts) throws IOException
- {
- for(int x=10000;x<100000;x++)//遍历
- {
- al.add("num:"+x);
- dudge(x,al,fw,ts);//判断方法
- }
- }
- private static void dudge(int num,ArrayList<String> al,FileWriter fw,TreeSet<String> ts) throws IOException {
- while(true)
- {
- StringBuilder sb=new StringBuilder();//建立字符串缓冲区
- char[] buf=(num+"").toCharArray();//获取数字对应的字符数组
- Arrays.sort(buf);//排序数组
- String min=new String(buf);//得到最小值
- String max=sb.append(min).reverse().toString();//得到最大值
- int mid=Integer.parseInt(max)-Integer.parseInt(min);//获取差值
- if (al.contains(max)) {//判断集合是否有这个最大数存在
- int id=al.indexOf(max);//索引位置
- fw.write(al.subList(id, al.size()).toString());//获取子list集合字符串兵写入文件
- ts.add(al.subList(id, al.size()).toString());//获取子list集合字符串并存入set集合
- al.clear();//清空集合,进行下次判断
- break;
- /*} else if (mid <= 0 || max.equals(min)) {//这个有点多余了,主要是每个数都要落入循环
- al.clear();
- break;*/
- } else {
- al.add(max);//没落入循环继续判断
- //System.out.println(map);
- dudge(mid,al,fw, ts);//递归
- }
- break;//最后断开
- }
- }
- }
复制代码 运行结果:
[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]
|