吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。以两个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;
}