吸血鬼数字

今天看到JAVA编程思想第4章一道练习题,觉得蛮有趣,顺手敲了一遍代码,借机分享出来,欢迎大家批评指正。

题目:吸血鬼数字是指位数为偶数的数字,可以由一堆数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。以两个0结尾的数字是不允许的,例如,下列数字都是“吸血鬼”数字:

1260=21*60

1827=21*87

2187=27*81

写一个程序,找出4位数的所有吸血鬼数字

思路和代码如下:

/**
     * 设"吸血鬼"数字为val,两个两位数分别为i和j,则val = i * j
     * 大致思路:尽可能提高算法效率,减少循环次数,i(10 =< i < 100)和 
        j (i =< j < 100, i <= j避免重复乘积)分别嵌套for循环,得到乘积val= i * j;
       将val、i和j的数字分别放到两个数组中,分别排序后利用array.sort比较是否相等,相等则满足条件
     * 要实现“吸血鬼”数字,需要满足以下条件:
     * 1、val为4位数,由于两个两位数相乘的结果可能为3或者4位数,为了得到4位数,可以限定j的循环范围,
       因为满足1000 =< i * j < 10000 且  j < 100 且 i <= j, 所以 max(1000/i, i) =< j < 100
     * 2、i和j中数字和val中的4位数字相同,顺序任意
     * 3、val不能以两个0结尾,若val除以100余数为0说明末尾两个数字为0
     */
    private static void calXxg() {
        // 统计“吸血鬼”个数
        int sumNum = 0;
        for(int i = 10;i <100; i++) {
            int start = Math.max(1000/i, i);
            int end = 100;
            for(int j = start; j < end; j++) {
                int val = i * j;
                
                // 若val除以100余数为0说明末尾两个数字为0,跳过
                if(val % 100 == 0) {
                    continue;
                }
                // 得到val的4位数字
                int a = val / 1000;
                int b = val / 100 % 10;
                int c = val / 10 % 10;
                int d = val % 10;
                // 得到i的两位数字
                int i1 = i / 10;
                int i2 = i % 10;
                // 得到j的两位数字
                int j1 = j / 10;
                int j2 = j % 10;

                int[] array = new int[]{a,b,c,d};
                int[] array1 = new int[]{i1,i2,j1,j2};
                Arrays.sort(array);
                Arrays.sort(array1);
                if(Arrays.equals(array1, array)){
                    sumNum++;
                    System.out.println("" + val + "=" + i + "*" + j);
                }
            }
        }
        System.out.println("吸血鬼个数为:" + sumNum);
    }

输出结果如下: 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值