有关吸血鬼数字算法的问题我找了很多, 发现大概有三种思路,当然不是具体的实现, 如下:
1. "笨方法1:“
代码如下:
public class getBloodGostNumber
{
public static void printBloodGostNumber()
{
int a, b, c, d;
for (int i = 1001; i < 10000; i++)
{
a = i / 1000;
b = i % 1000 / 100;
c = i % 100 / 10;
d = i % 10;
if (i == (a * 10 + b) * (c * 10 + d))
{
System.out.println("" + i + " = " + (a * 10 + b) + " * " + (c * 10 + d));
}
else if (i == (a * 10 + b) * (d * 10 + c))
{
System.out.println("" + i + " = " + (a * 10 + b) + " * " + (d * 10 + c));
}
else if (i == (b * 10 + a) * (c * 10 + d))
{
System.out.println("" + i + " = " + (b * 10 + a) + " * " + (c * 10 + d));
}
else if (i == (b * 10 + a) * (d * 10 + c))
{
System.out.println("" + i + " = " + (b * 10 + a) + " * " + (d * 10 + c));
}
else if (i == (a * 10 + c) * (b * 10 + d))
{
System.out.println("" + i + " = " + (a * 10 + c) + " * " + (b * 10 + d));
}
else if (i == (a * 10 + c) * (d * 10 + b))
{
System.out.println("" + i + " = " + (a * 10 + c) + " * " + (d * 10 + b));
}
else if (i == (c * 10 + a) * (b * 10 + d))
{
System.out.println("" + i + " = " + (c * 10 + a) + " * " + (b * 10 + d));
}
else if (i == (c * 10 + a) * (d * 10 + b))
{
System.out.println("" + i + " = " + (c * 10 + a) + " * " + (d * 10 + b));
}
else if (i == (a * 10 + c) * (b * 10 + d))
{
System.out.println("" + i + " = " + (a * 10 + c) + " * " + (b * 10 + d));
}
else if (i == (a * 10 + d) * (b * 10 + c))
{
System.out.println("" + i + " = " + (a * 10 + d) + " * " + (b * 10 + c));
}
else if (i == (a * 10 + d) * (c * 10 + b))
{
System.out.println("" + i + " = " + (a * 10 + d) + " * " + (c * 10 + b));
}
else if (i == (d * 10 + a) * (b * 10 + c))
{
System.out.println("" + i + " = " + (d * 10 + a) + " * " + (b * 10 + c));
}
else if (i == (d * 10 + a) * (c * 10 + b))
{
System.out.println("" + i + " = " + (d * 10 + a) + " * " + (c * 10 + b));
}
}
}
public static void main(String[] args)
{
printBloodGostNumber();
}
}
这里用的的是穷举法, 比较次数很多。。。。。
2.”笨方法2“
这次可以带过来写,代码如下:
import java.util.Arrays;
public class getBloodGostNumberAno
{
public static void printBloodGostNumber()
{
int ret;
int[] a = new int[4];
int[] b = new int[4];
for (int i = 10; i < 100; i++)
{
for (int j = 10; j < 100; j++)
{
ret = i * j;
if (ret > 9999)
continue;
a[0] = ret / 1000;
a[1] = ret % 1000 / 100;
a[2] = ret % 100 / 10;
a[3] = ret % 10;
b[0] = i / 10;
b[1] = i % 10;
b[2] = j / 10;
b[3] = j % 10;
if (b[1] == 0 && b[3] == 0)
continue;
Arrays.sort(a);
Arrays.sort(b);
//System.out.println(Arrays.equals(a, b));
if (Arrays.equals(a, b))
{
System.out.println("" + ret + " = " + i + " * " + j);
}
}
}
}
public static void main(String[] args)
{
printBloodGostNumber();
}
}
当然,具体实现时还可以用容器之类的。。。
3.我目前已知的最好的方法
代码如下:
import java.util.Arrays;
public class getBloodGostNumberAno2
{
public static void printBloodGostNumber()
{
int ret;
int from, to;
int count = 0;
int[] a = new int[4];
int[] b = new int[4];
for (int i = 10; i < 100; i++)
{
from = Math.max(1000 / i, i + 1);
to = Math.min(9999 / i, 99);
for (int j = from; j <= to; j++)
{
ret = i * j;
if (ret % 100 == 0 || (ret -i - j) % 9 != 0) {
continue;
}
a[0] = ret / 1000;
a[1] = ret % 1000 / 100;
a[2] = ret % 100 / 10;
a[3] = ret % 10;
b[0] = i / 10;
b[1] = i % 10;
b[2] = j / 10;
b[3] = j % 10;
count++;
Arrays.sort(a);
Arrays.sort(b);
//System.out.println(Arrays.equals(a, b));
if (Arrays.equals(a, b))
{
System.out.println("" + ret + " = " + i + " * " + j);
}
}
}
System.out.println(count);
}
public static void main(String[] args)
{
printBloodGostNumber();
}
}
这里的比较次数最少。。。可以参考: