吸血鬼数字,是指数位为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含
乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。
以两个0结尾的数字是不允许的,例如,下列数字都是'吸血鬼'数字
1260 = 21 * 60
1827 = 21 * 87
2187 = 27 * 81
static void vampire(){
/*
思路:
1、过滤掉不符合条件的
2、将乘积结果转化为字符串去对比两个乘数
3、循环对比结果每一位字符和两个乘数字符位数
*/
int max=99;
//保存
Set<String> vampires=new HashSet<>();
for (int i = 10; i < max; i++) {
for (int j = 10; j < max; j++) {
int result=i*j;
//过滤两个0结尾的数字,和<=1000的数字
if(i%10==0&&j%10==0||result<1000){
continue;
}
//查询result是否包含i或j
String iS=i+"";
String jS=j+"";
//对比结果,只有全匹配通过才全部为true
boolean compareResult[]=new boolean[4];
//记录该位置的值是否已经对比使用过
boolean iHasUse[]=new boolean[2];
boolean jHasUse[]=new boolean[2];
//当前索引
int index=0;
for (char c : (result + "").toCharArray()) {
String single=c+"";
//标记是否从第一位数中找到
boolean hasFind=false;
//从第一位数中查找
for (int q = 0; q < iS.toCharArray().length; q++) {
if(single.equals(iS.charAt(q)+"")){
if(iHasUse[q]){//已经使用该值对比过
continue;
}
compareResult[index]=true;
iHasUse[q]=true;
hasFind=true;
}
}
//第一位数中不存在,继续在第二位数中查找
if(!hasFind){
//从第二位数中查找
for (int q = 0; q < jS.toCharArray().length; q++) {
if(single.equals(jS.charAt(q)+"")){
if(jHasUse[q]){//已经使用该值对比过
continue;
}
compareResult[index]=true;
jHasUse[q]=true;
}
}
}
index++;
}
boolean isVampire = true;
for (boolean b : compareResult) {
if(!b){
isVampire=b;
break;
}
}
if(isVampire){
vampires.add(result+"");
System.out.println("Vampire========>"+i+" * "+j+" = "+(i*j));
}
}
}
System.out.println("吸血鬼数字==========");
for (String vampire : vampires) {
System.out.println(vampire);
}
System.out.println("吸血鬼数字==========");
}