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

 

posted on 2017-09-11 22:20  NEU-2015  阅读(253)  评论(0编辑  收藏  举报

导航