问题描述:假设有一个各个位数数字互不相同的数,把所有数字从大到小排序后得到a,从小到大排序后得到b,然后用a-b替代原来的数,并继续上述操作。例如,从1234出发,依次为4321-1234=3087、8730-378=8352、8532-2358=6174、8532-2358=6174。发现所有的数最终都能循环。
样例输入:1234
样例输出:1234->3087->8352->6174->6174
1.java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* 6147问题
* @author NEU-2015
*
*/
public class Demo {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int a;
int next;
boolean flag;
List<Integer> list = new ArrayList<Integer>();
while (input.hasNext()) {
flag = true;
list.clear();
a = input.nextInt();
System.out.print(a);
list.add(a);
next = get_Next(a);
while (!list.contains(next)) {
System.out.print("->" + next);
list.add(next);
next = get_Next(next);
}
System.out.println("->" + next);
}
}
//将各个位数数字排序 取得最大与最小值 求得下一个数
public static int get_Next(int x) {
List<Integer> list = new ArrayList<Integer>();
int temp; //交换时的中间代理
int min = 0;
int max = 0;
while (x > 0) { //将x各个位数上的数拆下来
list.add(x % 10);
x /= 10;
}
for (int i = 0; i < list.size(); i++) { // 冒泡排序 从小到大
for (int j = i + 1; j < list.size(); j++) {
if (list.get(i) > list.get(j)) {
temp = list.get(j);
list.remove(j);
list.add(j, list.get(i));
list.remove(i);
list.add(i, temp);
}
}
}
for (int i = list.size() - 1; i >= 0; i--) {
min += list.get(i) * Math.pow(10, list.size() - 1 - i); //取得最小值
}
for (int i = 0; i < list.size() / 2; i++) { // 翻转 从大到小
temp = list.get(i);
list.remove(i);
list.add(i, list.get(list.size() - i - 1));
list.remove(list.size() - i - 1);
list.add(list.size() - i, temp);
}
for (int i = list.size() - 1; i >= 0; i--) { //取得最大值
max += list.get(i) * Math.pow(10, list.size() - 1 - i);
}
return max - min;
}
}