吸血鬼数字| JAVA

发布于 2021-07-10  26 次阅读


问题如下

在这里插入图片描述

解决代码

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
    // write your code here
        int num1,num2,num3;
        char[] pArray;//乘积的字符数组
        char[] nArray;//数字的字符数组
        for (num1=11;num1<=99;num1++)
        {
            for (num2=1000/num1+1>num1?1000/num1+1:num1;num2<=99;num2++)
            {
                num3=num1*num2;
                if ((num3-num1-num2)%9!=0||num3%100==0)
                {
                    continue;
                }
                pArray=String.valueOf(num3).toCharArray();
                Arrays.sort(pArray);
                nArray=(String.valueOf(num1)+String.valueOf(num2)).toCharArray();
                Arrays.sort(nArray);
                if (Arrays.equals(pArray,nArray))
                {
                    System.out.println(num1+"*"+num2+"="+num3);
                }

            }
        }
    }
}

代码说明

第一点
abcd = 1000a+100b+10c-d
任意的2位组合,如ac,db, 表示为10a+c,10d+b
则abcd - ac-db = 990a+99b+9c-9d
这个数肯定是9的倍数,
对于其他的2位组合,也成立
所以,对于满足条件的吸血鬼数字,(i_val - i - j) % 9 != 0 肯定成立
不满足这个条件的,则不是吸血贵数字
利用这个条件可以减少内层循环次数

第二点
num2的初始值的设定。注意到num1和num2都是两位数,为避免重复,可设定num2不小于num1,又因为num1和num2的乘积大于1000,因此num2应取1000/num1 + 1 与 num1中的较大者。如此一来,相比直接设定num2 = 11,num2= num1要减少很多内层循环次数。

第三点
比较部分是利用字符数组排序后再equals比较,判断是否为吸血鬼数字