吸血鬼数字

吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。以两个0结尾的数字是不允许的,例如:
1260 = 21 * 60
1827 = 21 * 87
2187 = 27 * 81

代码写的很随意,没有优化

@Test
    public void test(){
        for (int i = 1000; i < 100000000; i++){
            vampireNum(i);
        }
    }

    //判断一个数字是否为吸血鬼数字
    public boolean vampireNum(int num){
        boolean flog = false;
        StringBuilder numStr = new StringBuilder(num+"");
        int length = numStr.length();

        //不为负数,并且大于位数大于4
        if (num <= 1000){
            return flog;
        }
        //数字位数不为偶数
        if((length % 2) != 0){
            return flog;
        }
        //最后两位为0
        if("00".equals(numStr.substring(length - 2,length))){
            return flog;
        }
        //计算因数的最小值
        int halfLength = length / 2;
        int temp = 1;
        for (int i = 1; i < halfLength; i++){
            temp *= 10;
        }

        for (int i = temp; i < temp * 10; i++ ){
            for (int j = temp ; j < temp * 10; j++){
                //因数相乘等于指定数值 && i有num的一半字符 && j有num的一半字符
                if (i * j == num && contain(numStr.toString(), i + "") && contain(numStr.toString(), j + "")
                        && charsOfStr(num+"") == charsOfStr(i + "" + j )){
                    //i和j分别包含num中的一半位数的数字
                    System.out.printf("%d * %d = %d \n",i,j,num);
                    return true;
                }
            }
        }
        return flog;
    }

    //判断str1中有几位不一样的字符,str2是否有str1中一半的字符,并且
    public boolean contain(String str1,String str2){
        boolean flog = false;
        int index1 = charsOfStr(str1);
        int index2 = charsOfStr(str2);
        char[] str2Array = str2.toCharArray();
        //如果str2中的字符不同个数,不为str1中一半后置一半+1,则返回false
        if (index2 != Math.round(index1/2)){
            return flog;
        }
        for (int i = 0; i < str2Array.length; i++){
            if(!str1.contains(str2Array[i]+"")){
                return flog;
            }
        }
        flog = true;

        return flog;
    }

    public int charsOfStr(String str){
        char[] str1Array = str.toCharArray();
        int index = 0;
        for (int i = 0; i < str1Array.length; i++){
            char temp = str1Array[i];
            if(temp == '-'){
                continue;
            }
            str1Array[i]= '-';
            index++;
            //如果内容为‘-’,则表示已经取过的索引
            for(int j = i + 1; j < str1Array.length; j++){
                if (str1Array[j] == '-'){
                    continue;
                }
                //相同则为‘-’
                if (temp == str1Array[j]){
                    str1Array[j] = '-';
                }
            }
        }
        return index;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值