Thinking in Java第四章练习10

Thinking in Java第四章练习10

吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。 
以两个0结尾的数字是不允许的,例如,下列数字都是“吸血鬼数字”: 
1260=21*60 
1827=21*87 
2187=27*81 
写一个程序,找出4位数的所有吸血鬼数字(Dan Forhan推荐)。

我的解题思路就是轮询所有的2位数组合,比较乘积和这对数字的各位数的组合,这里的比较有两种方式,一种是拆分成数字比较,一种是拆分成字符,这里分析了一下两种方法的执行效率,代码如下:

package control;

import java.util.Arrays;

public class Exercise10
{
    public static void main(String[] args)
    {
        long startTime = System.currentTimeMillis();
        findVampireNumbers("int");
        long endTime = System.currentTimeMillis();
        System.out.println("compare in int :" + (endTime - startTime));
        startTime = System.currentTimeMillis();
        findVampireNumbers("char");
        endTime = System.currentTimeMillis();
        System.out.println("compare in char:" + (endTime - startTime));
    }

    private static void findVampireNumbers(String way)
    {
        for (int i = 10; i < 100; i++) {
            for (int j = i; j < 100; j++) {
                int product = i * j;
                if (product < 1000) {
                    continue;
                }
                if (product > 9999) {
                    break;
                }
                boolean isVampire;
                if (way.equals("int")) {
                    isVampire = compareInInt(i, j, product);
                } else {
                    isVampire = compareInChar(i, j, product);
                }
                if (isVampire) {
                    System.out.println(i + "*" + j + "=" + product);
                }
            }
        }
    }

    private static boolean compareInInt(int i, int j, int product)
    {
        int[] checkDigit = splitNum(i * 100 + j);
        int[] productDigit = splitNum(product);
        int matched = 0;
        for (int one :
                productDigit) {
            for (int k = 0; k < 4; k++) {
                if (checkDigit[k] == one) { matched ++;
                    checkDigit[k] = -1;
                    break;
                }
            }
        }
        return matched == 4;
    }

    private static int[] splitNum(int i)
    {
        int[] result = new int[4];
        for (int j = 0; j < 4; j++) {
            result[j] = i % 10;
            i = i / 10;
            if (i <= 0) {
                break;
            }
        }
        return result;
    }

    private static boolean compareInChar(int i, int j, int product)
    {
        String productStr = Integer.toString(product);
        String checkStr = Integer.toString(i) + Integer.toString(j);
        char[] productChar = productStr.toCharArray();
        char[] checkChar = checkStr.toCharArray();
        Arrays.sort(productChar);
        Arrays.sort(checkChar);
        return Arrays.equals(productChar, checkChar);
    }
}/*output:
15*93=1395
21*60=1260
21*87=1827
27*81=2187
30*51=1530
35*41=1435
80*86=6880
compare in int :6
15*93=1395
21*60=1260
21*87=1827
27*81=2187
30*51=1530
35*41=1435
80*86=6880
compare in char:25
*/

结论:

  • 用int比较,代码效率更高
  • 用char比较,代码更简洁,可读性更强

你可能感兴趣的:(Thinking in Java第四章练习10)