吸血鬼数字
问题如下
解决代码
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比较,判断是否为吸血鬼数字