算法游戏-黑洞数(java实现)

首先描述一下什么是黑洞数,黑洞数又称陷阱数,是类具有奇特转换特性的整数。任何一个数字不全相同整数,经有限“重排求差”操作,总会得某一个或一些数,这些数即为黑洞数。“重排求差”操作即把组成该数的数字重排后得到的最大数减去重排后得到的最小数

java实现代码如下:

public class Test2 {
    private int m = 0;
    public static void main(String[] args) {
        System.out.print("请输入数字:");
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        Test2 test2 = new Test2();
        test2.m = n;
        test2.getBlackHoleNum(n);
    }

    public void getBlackHoleNum(int n) {
        List list = new ArrayList<>();//用于记录每次相减得到的数
        int min = 0;//重排最大值
        int max = 0;//重排最小值
        Boolean over = true;//判断相减的数是否有循环,如果有循环就直接结束,否则一直进行下去
        Boolean flag = true;//用于循环计算输入数的位数
        int count = 0;//记录输入的数是多少位
        int temp = n;//防止重排的n在计算的时候发生改变,就用一个变量temp来记录一下
        int position = 0;//记录出现循环的位置
        while (over) {
            count = 0;
            temp = n;
            while (flag) {
                temp = temp / 10;
                count++;
                if (temp == 0) {
                    flag = false;
                }
            }
            max = getMax(n, count);
            min = getMin(n, count);
            n = max -min;
            //用循环依次比较list中是否有n存在,如果存在直接退出,打印黑洞数
            for(int i=0;i a[j]) {
                        int k = a[i];
                        a[i] = a[j];
                        a[j] = k;
                    }
                }
            }
            c--;
        }
        for (int m = 0; m < count; m++) {
            int p = m;
            while (p != 0) {
                a[m] = a[m]*10;
                p--;
            }
            max = max +a[m];
        }
        return max;
    }

    //获取最小的数,类似获取最大数
    public int getMin(int n, int count) {
        int[] a = new int[count];
        for (int m = 0; m < count; m++) {
            a[m] = n - (n / 10)*10;
            n = n / 10;
        }
        int c = count;
        int min = 0;
        int j = 0;
        while (c != 0) {
            for (int i = 0; i < c; i++) {
                j = i + 1;
                if (j != c) {
                    if (a[i] < a[j]) {
                        int k = a[i];
                        a[i] = a[j];
                        a[j] = k;
                    }
                }
            }
            c--;
        }

        for (int m = 0; m < count; m++) {
            int p =m;
            while (p != 0) {
                a[m] = a[m]*10;
                p--;
            }
            min = min +a[m];
        }
        return min;
    }
}
值得注意的几个问题就是:

1.黑洞数可能是一个,也可能是一组数,所以我用的是list来存储求出来的黑洞数

2.这里面主要的问题就是一些细节要注意,比如注意变量的改变情况,不要出现死循环,如果大家不知道问题出在哪里,可以使用debug运行模式来执行,这样就知道在哪里出现问题,知道哪个点需要修改。

测试结果:

三位数的黑洞数都是495

四位数的黑洞数都是6174


五位数的黑洞数就是上面四个,可能就是顺序不一样。

大家可以进行测试,当然如一位数,两位数还有每一位都是一样的比如999,这个当然黑洞数是0。




你可能感兴趣的:(算法,黑洞数,算法游戏)