首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

数组,该怎么解决

2012-12-23 
数组验证下面结论: 一个各位数字不同且都不为0的N位数X(3N5), 将组成该数的各位数字重新排列成一个最

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


            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;
    }


[其他解释]
也可能是出现成段的多个数反复重复
上面那句话怎么理解呢
[其他解释]
引用:
也可能是出现成段的多个数反复重复
上面那句话怎么理解呢

就一直重复重复的
[其他解释]
该回复于2012-12-10 08:55:17被管理员删除
[其他解释]
引用:
引用:也可能是出现成段的多个数反复重复
上面那句话怎么理解呢
就一直重复重复的
那就没有必要强调了啊,意思就是所出现和前面一个相同的即可,是不是呢
[其他解释]
引用:
引用:
引用:也可能是出现成段的多个数反复重复
上面那句话怎么理解呢
就一直重复重复的那就没有必要强调了啊,意思就是所出现和前面一个相同的即可,是不是呢

是的
[其他解释]
这个应该是一个数学规律吧,叫什么来着?楼主
[其他解释]
引用:
这个应该是一个数学规律吧,叫什么来着?楼主

牛啊
好像叫递归吧
[其他解释]
引用:
引用:


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


Java code
?



1234567891011121……


main方法里的不太懂,可以解释下吗
[其他解释]


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;
}

热点排行