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