Java编程思想吸血鬼数字实现

Desciption

吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,而这对数字的位数是原数字的一半位数,并且由组成原数字的各个位数组成,以两个0结尾的数字不是吸血鬼数字。
例如:1260 = 21 * 60 1827 = 21 * 87 2187= 27 * 81
求所有四位吸血鬼数字

求解思路

假设value=i*j (其中i < j,10 <= i <= 99)
判断j的循环范围,就至少需要两者的乘积可以构成四位数,两位数字的范围是1000/i到10000/i。
为了避免出现重复的乘积,还需和i+1比较大小。
假设value = 1000a + 100b + 10c + d, 因为满足val = i * j,
则有x = 10a + b, y = 10c + d(这里的只是对一种情况进行假设 可以是10a+d 10c+b)
则value - i - j = 990a + 99b = 9 * (110a + 11b), 所以value - i - j能被9整除,
其他的数位组合也是一样的
所以满足该条件的数字必定能被9整除,所以可以直接过滤其他数字。

实现

 public static void getVempire() {
        int count = 0; //记录循环次数
        int sum = 0;//记录组数
        String[] sij, sv;//sij记录乘数组成的字符串数组,sv记录value组成的字符串数组
        int value;
        int from;
        //双重循环
        for (int i = 10; i < 100; i++) {
            // j=i+1避免重复
            // 这里主要是为了让 i * j >= 1000的意思
            from = Math.max(1000 / i, i + 1);
            for (int j = from; j < 100; j++) {
                value = i * j;
                //关键代码
                // 满足条件的整数必定能被9整除
                if ((value - i - j) % 9 != 0 || value % 100 == 0)//value后两位不能为0
                    continue;
                count++;
                sij = (String.valueOf(i) + j).split("");
                sv = String.valueOf(value).split("");
                Arrays.sort(sij);
                Arrays.sort(sv);
                if (Arrays.equals(sij, sv)) {// 排序后比较,为真则找到一组
                    sum++;
                    System.out.println("第" + sum + "组: " + i + "*" + j + "=" + value);
                }
            }
        }
        System.out.println("共找到" + sum + "组吸血鬼数");
        System.out.println("一共运行" + count + "次");

    }

运行结果

image.png

参考博客
https://blog.csdn.net/sinat_37976731/article/details/78526067
https://www.cnblogs.com/wenjieyatou/p/5913253.html

你可能感兴趣的:(Java编程思想吸血鬼数字实现)