我写的只依靠 循环嵌套 + 1个数组的 吸血鬼数字代码
思路:将任意四位数拆解为 四个单独的数字。然后依托数组和循环嵌套,模拟排列组合运算 4*3*2*1.最后进行与原整数匹配。
没解决委托:为什么每个结果会打印两遍?
import static net.mindview.util.Print.*;
public class VampireNum
{
public static void main(String args[])
{
for(int i = 1000; i<10000; i++)
{
int d = i % 10;
int c = ((i - d) % 100)/10;
int b = ((i - (10*c + d))%1000)/100;
int a = ((i - (100*b +(10*c + d)))%10000)/1000; // 提前四位整数的每个数字
int[] test = new int[4];
test[0]= a;
test[1]= b;
test[2]= c;
test[3]= d; //将四个数字放入四位数组
for(int k=0; k<4; k++)
{
int a1 = test[k]; //提取第一个数,四种可能
for(int l=0; l<4;l++)
{
int a2 = test[l];
if(a2 != a1) //提取第二个数,排除掉第一个数,三种可能
{
int j1 = a1*10 + a2; //从四位数字中,任选两个数组成两位数
for(int m = 0; m <4; m++)
{
int a3 = test[m];
if(a3 != a2 && a3 != a1) //提取第三个数,二种可能
{
int j2 = a3*10;
for(int p = 0; p <4; p++)
{
int a4 = test[p];
if(a4 != a3 && a4 != a2 && a4 != a1) //提取第四个数,一种可能
{
int j3 = j2+a4; //最后任意两个数组成两位数
int j4 = j1*j3;
if(i == j4 && i%100 != 0)
{
//print("number= " + i);
print("number: " + i + " = " + j1 + "*" + j3);
}
}
}
}
}
}
}
}
}
}
}
输出结果:每个结果会打印两遍,原因是,j1 与 j3 顺序互换,也视为了输出结果。
number: 1260 = 21*60
number: 1260 = 60*21
number: 1395 = 15*93
number: 1395 = 93*15
number: 1435 = 41*35
number: 1435 = 35*41
number: 1530 = 51*30
number: 1530 = 30*51
number: 1827 = 87*21
number: 1827 = 21*87
number: 2187 = 27*81
number: 2187 = 81*27
补充,我发现,重复打印问题,基本上只打印奇数或者只打印偶数就可以解决了。于是我进行了一下求模筛选。
if(i == j4 && i%100 != 0)
{
count ++;
if(count % 2 == 0) //防止重复输出
{
print("number: " + i + " = " + j1 + "*" + j3);
}