Thinking in Java第四章练习10

作者: 小小浪把_Dont_know拍 | 来源:发表于2017-03-12 09:23 被阅读33次

    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

        本文链接:https://www.haomeiwen.com/subject/lirtnttx.html