首先解释一下吸血鬼数字:吸血鬼数字是指位数为偶数的数字,可由一对数字相乘而得到,这对数字各包含乘积的一半位数的数字,以两个0结尾的数字是不允许的。
四位数吸血鬼数字示例:1260=21*60,1827=21*87,2187=27*81……
先列出结果:一共7个:1260=21*60,1395=15*93,1435=41*35,1530=51*30,1827=87*21,2187=27*81,6880=86*80
其它优秀方法:https://blog.csdn.net/tianmijieguo/article/details/46400911
解题目标:
- 考虑可复用性,单独写一个函数用来判断是不是吸血鬼数。
- 如何把整数给分隔开,编写了toSeparateInt()方法,可以把任意大小的整数分隔成数组的形式。
解题过程:
- 创建一个Vampire类 用来存储 吸血鬼数的相关信息
- 编写 isVampire(int i)函数,返回Vampire类型数据,当Vampire.isV为true时代表当前数是吸血鬼数,把大问题分隔成多个小问题逐一解决
- 因为有了isVampire()方法,在main()方法只把4位数遍历一遍就可以了
public class f {
public static void main(String[] args) {
Vampire v = new Vampire();
for (int i = 1001; i < 10000; i++) { // 后面不能以 00 结束,所以从1001开始,
v = isVampire(i);
// isVampire决断是不是 vampire数,若是 vampire中isV为真
if (v.isV) {
System.out.println(v);
}
}
}
public static Vampire isVampire(int i) {
Vampire v = new Vampire();
if (i % 100 == 0)
{
return v; // i % 100 == 0 说明 i 以 00结束,这是不允许的
}
int a[] = toSeparateInt(i);
// vampire数第一步是将i 的个位,十位分开
for (int n1 = 0; n1 < 4; n1++) {
for (int n2 = 0; n2 < 4; n2++) {
if (n2 == n1)
continue;
for (int n3 = 0; n3 < 4; n3++) {
if (n3 == n1 || n3 == n2) {
continue;
}
for (int n4 = 0; n4 < 4; n4++) {
if (n4 == n3 || n4 == n2 || n4 == n1) {
//
continue;
}
else if(((a[n1] * 10 + a[n2]) * (a[n3] * 10 + a[n4])) == i) {
// 这个条件成立,说明是吸血鬼数
v.sum = i;
v.x1 = a[n1] * 10 + a[n2];
v.x2 = a[n3] * 10 + a[n4];
v.isV = true;
// 对吸血鬼数进行封装
return v;
}
}
}
}
}
return v;
}
public static int[] toSeparateInt(int i) {
// 这些方法将 i 进行分隔成整数数组并返回整形数组
char[] ch = Integer.toString(i).toCharArray();
// 第一步,将整数转为字符数组
int a[] = new int[ch.length];
for (int n = 0; n < a.length; n++)
a[n] = Integer.parseInt(String.valueOf(ch[n]));
// 第二步,把字符数组转为整数数组
return a;
// 第三步,返回
}
}
class Vampire {
long sum; // 存放商
long x1; // 存放积
long x2; // 存放第二个积
boolean isV; // 存放是不是吸血鬼数
public String toString() {
// 重写一下toString
return "" + sum + " = " + x1 + "*" + x2;
// ""后面的输出全部转字符串
}
}
由于才疏学浅,在数据结构方面写的一塌糊涂,为了突出思想,并没有修改 多层循环 部分,可以参考https://blog.csdn.net/tianmijieguo/article/details/46400911,上面有很好的方法。
如有错误请指正。谢谢