读书人

(蓝桥杯)java模拟题第十题-数目字黑洞

发布时间: 2012-09-18 16:21:42 作者: rapoo

(蓝桥杯)java模拟题第十题---------数字黑洞
任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]
其中数字的先后顺序可以不考虑。
(代码其实并不算长,只是注释写多了。如果有更好的方法,望赐教。)

/** * @category 数字黑洞 * @author liucanwen * @time 2012-1-17 20:30 */public class NumberBlackHole{@SuppressWarnings("unchecked")ArrayList list = null;@SuppressWarnings("unchecked")public static void main(String[] args) throws Exception{NumberBlackHole nbh = new NumberBlackHole();//循环:从10000~99999的所有五位数,求出所有5位数的数字黑洞for(int i = 10000; i <= 99999; i++){//当数字可以整除11111直接输出"[0]"if(i % 11111 == 0) {//System.out.println("[0]");continue;}//调用方法getCycle()来得到数字序列listArrayList list2 = nbh.getCycle(i, 0);//标志索引:数字黑洞的开始索引。int deleteIndex = 0;//遍历得到的list2(数字序列)for(int j = 0; j < list2.size(); j++){//得到数字黑洞的开始索引if(list2.get(j).equals(list2.get(j + 4))){deleteIndex = j;break;}}//删除数字黑洞开始索引之前的数字for(int k = 0; k < deleteIndex; k++){list2.remove(0);}//删除数字黑洞之后的数字,只保留数字黑洞一次循环体for(int m = 0; m < 10 - deleteIndex - 4; m++){list2.remove(list2.size() - 1);}//打印数字黑洞的一次循环体System.out.println(list2);}}/** * @param number 传过来的5位数 * @param index 是该方法在递归的时候做标识退出 * @return ArrayList 装有数字黑洞的数字序列 */@SuppressWarnings("unchecked")public ArrayList getCycle(int number, int index){//首次进入该方法,创建一个ArrayList,用于装数字序列if(0 == index) list = new ArrayList();//当递归十次,返回长度为10的数字序列listif(10 == index) return list;//把传过来的数字转换成String,再把String转换成char[]数组String str = String.valueOf(number);char[] chars = str.toCharArray();//再对数组进行升序排序,从而得到最大值和最小值Arrays.sort(chars);//初始化传过来的五位数字int first = 0;int second = 0;int three = 0;int four = 0;int five = 0;//当最大值-最小值得到的结果为五位数if(5 == chars.length){first = Integer.parseInt(String.valueOf(chars[0]));second = Integer.parseInt(String.valueOf(chars[1]));three = Integer.parseInt(String.valueOf(chars[2]));four = Integer.parseInt(String.valueOf(chars[3]));five = Integer.parseInt(String.valueOf(chars[4]));}//当最大值-最小值得到的结果为四位数else if(4 == chars.length){second = Integer.parseInt(String.valueOf(chars[0]));three = Integer.parseInt(String.valueOf(chars[1]));four = Integer.parseInt(String.valueOf(chars[2]));five = Integer.parseInt(String.valueOf(chars[3]));}//当最大值-最小值得到的结果为三位数else if(3 == chars.length){three = Integer.parseInt(String.valueOf(chars[0]));four = Integer.parseInt(String.valueOf(chars[1]));five = Integer.parseInt(String.valueOf(chars[2]));}//当最大值-最小值得到的结果为二位数else if(2 == chars.length){four = Integer.parseInt(String.valueOf(chars[0]));five = Integer.parseInt(String.valueOf(chars[1]));}//当最大值-最小值得到的结果为一位数else if(1 == chars.length){five = Integer.parseInt(String.valueOf(chars[0]));}else{return null;}//把传过来的五位数排成最大值和最小值int minValue = first*10000 + second*1000 + three*100 + four*10 + five;int maxValue = first + second*10 + three*100 + four*1000 + five*10000;//得到最大值-最小值的差countint count = maxValue - minValue;//把上面得到的差count放到list当中list.add((Integer)count);//进行递归,递归结束条件由index来控制getCycle(count, index + 1);return list;}}

读书人网 >编程

热点推荐