6174问题
问题描述:假设有一个各个位数数字互不相同的数,把所有数字从大到小排序后得到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; } }