验证下面结论: 一个各位数字不同且都不为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.   


    这个题目思路比较清晰:
    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++) {
                arr[i] = chrs[i] - '0';       // 相减得出int
            }
            return arr;
        }
        public static int arr2Int(int[] arr, boolean isAsc) {
            int base = 1;
            int sum = 0;
            if (isAsc) {  // 正序-从小到大
                for (int i = arr.length - 1; i >= 0; i--) {
                    sum += arr[i] * base;
                    base *= 10;
                }
            }
            else {        // 倒序-从大到小
                for (int n : arr) {
                    sum += n * base;
                    base *= 10;
                }
            }
            return sum;
        }
      

  2.   


    main方法里的不太懂,可以解释下吗
      

  3.   

    public static void main(String[] args) {
    aa(123);
    }

    public static void aa(int num) {
    String[] arr = orgArr(num); 

    int result2 = getNum(arr, true) - getNum(arr, false);
    System.out.println(getNum(arr, true) + "-" + getNum(arr, false) + "=" + result2);
    int result1 = 0;
    int flg = 1;

    while(result2!=result1) {
    result1 = result2;
    arr = orgArr(result2);
    result2 = getNum(arr, true) - getNum(arr, false);
    System.out.println(getNum(arr, true) + "-" + getNum(arr, false) + "=" + result2);
    flg += 1;
    }
    System.out.println("减"+(flg-1)+"次后开始循环");
    }

    public static int getNum(String[] arr, boolean isBig) {
    StringBuffer num = new StringBuffer();
    if(isBig) {
    for(int i=arr.length-1; i>=0 ;i-- ) {
    num.append(arr[i]);
    }
    }else {
    for(String a : arr) {
    num.append(a);
    }
    }
    return Integer.parseInt(num.toString());


    /**
     * 小到大
     * @param num
     * @return
     */
    public static String[] orgArr(int num) {
    String a[] = (num+"").split("");
    Arrays.sort(a);
    return a;
    }