日期:2014-05-20  浏览次数:20680 次

数组
验证下面结论: 一个各位数字不同且都不为0的N位数X(3<=N<=5), 将组成该数的各位数字重新排列成一个最大数和一个最小数作减法, 其差值再重复前述运算, 若干次后必出现一个N位数Y, 使之重复出现. 例如: X=213, 则有213→321-123=198 

981-189=792 

982-289=693 

963-369=594 

954-459=495 

954-459=495 

这时Y=954. (注意:重复不仅仅是与上一次的数相同,也可能是出现成段的多个数反复重复) 

输入

一个数X

输出

相减几次后开始重复出现。

样例输入
213
样例输出
5
提示




解释:



输入:1234 



4321-1234=3087 



8730- 378 =8352 



8532- 2358= 6174 



7641 -1467= 6174 






所以减3次后开始循环。



输出应为3次



------最佳解决方案--------------------
引用:


这个题目思路比较清晰:
1、对inputNum进行正序和倒序排列,分别得出max和min;
2、想减得出一个过程数据temp,再inputNum=temp继续循环;
3、指导当前temp和前一个temp相等,终止循环。  (所以此处使用int[2]来判断)

    public static void main(String[] args) {
        int res = 1234;
        
        int[] arrTemp = new int[2];
        int n = 0;
        for (;; n++) {  // 循环迭代
            res = doMinus(res);
            arrTemp[n & 1] = res;   // 交替赋值
            if (arrTemp[0] == arrTemp[1]) {
                break;              // 出现重复,则退出
            }
            System.out.println("The " + (n + 1) + "th result is: " + res);
        }
        System.out.println("Loop finish after [" + n + "] times");
    }
    public static int doMinus(int input) {
        int[] arr = int2arr(input);
        Arrays.sort(arr);
        int max = arr2Int(arr, false);   // 倒序-从大到小
        int min = arr2Int(arr, true);    // 正序-从小到大
        return max - min;
    }
    public static int[] int2arr(int num) {
        // 使用String转换,是为了数位可扩展
        char[] chrs = Integer.toString(num).toCharArray();
        int[] arr = new int[chrs.length];
        for (int i = 0; i < chrs.length; i++) {