吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,而这对数字各包含乘积的一
半位数的数字,其中从最初的数字中选取的数字可以任意排序。以2个0结尾的数字是不允许
的,例如,下列数字都是吸血鬼数字:
1260 = 21*60
1827 =21*87
2187 =27*81
写该程序的思想是:
1.首先找到满足这个等式的3个数,然后再从其中选出是吸血鬼数字的数字。下面的vampire
函数就是先找出这样的等式,然后调用CompareString()函数来判断是否是吸血鬼数字。
public static void Vampire()
{
for(int i =999;i<9999;i++)
{
if((i%100) == 0) continue;
for(int j=11;j<100;j++)
for(int k =11;k<j;k++)
{
if(j*k == i)
{
String si ="" +i;
String sj ="" +j;
String sk ="" +k;
if(CompareString(si,sj,sk))
{
System.out.println(si +" =" +sj +"*"+sk);
}
}
}
}
}
2.调用CompareString()函数有3个String参数,分别表示是乘积,乘数,乘数。在进行判断时,将2个乘数变为一个String再和乘积进行比较。比较过程中使用了一个Sort()的排序函数。
public static boolean CompareString(String target,String str1,String str2)
{
int count = 0;
String StrTemp = str1 + str2;
char s1[] =target.toCharArray();
char s2[] = StrTemp.toCharArray();
Sort(s1);
Sort(s2);
for(int i =0;i<s1.length;i++)
{
if(s1[i] == s2[i])
{
count++;
}
}
if(count == s1.length) return true; // 如果每一位都对应相同,则返回true;否则为false
else return false;
}
3.Sort()函数的作用将char数组中的数字,按照从小到大的顺序进行排列。如一个char数组为{'1','2','6','0'}则经过Sort()函数变为{'0','1','2','6'}.所以最后比较是否为吸血鬼数字,就是比较2个字符串经过排序后是否一样。其实2个乘数组合的字符串与乘积的字符串只是字母顺序不一样。经过排序后,就可以很好的比较了。
public static void Sort(char[] numArray)
{
int length = 0;
length = numArray.length;
for(int i =1; i<length;i++)
{
int j = i -1;
char Temp = numArray[i];
while(j>=0&&Temp<numArray[j])
{
numArray[j+1] = numArray[j];
j--;
}
numArray[j+1] = Temp;
}
}
另附一网友JAVA实现吸血鬼数字的高效算法:http://blog.csdn.net/java2000_net/article/details/3851203
到此,就可以进行判断是否为吸血鬼数字了。
通过求吸血鬼数字,有一个很重要的思想对于如求类似的问题。如:
String s1 = "abcdsddgff";
String s2 = "ddfgfascdb";
要判断这2个字符串是否含有相同的字母,并且对于同一字母个数是否相同,就可以应用本思想。可以先将字符串排序后,再来进行比较。排序后s1变为abcdddffgs,s2变为abcdddffgs,则可以很容易比较了。至于排序算法,可以有很多选择。