java--吸血鬼数的判断

       首先解释一下吸血鬼数字:吸血鬼数字是指位数为偶数的数字,可由一对数字相乘而得到,这对数字各包含乘积的一半位数的数字,以两个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

        解题目标:

  1. 考虑可复用性,单独写一个函数用来判断是不是吸血鬼数。
  2. 如何把整数给分隔开,编写了toSeparateInt()方法,可以把任意大小的整数分隔成数组的形式。

         解题过程:

  1. 创建一个Vampire类 用来存储 吸血鬼数的相关信息
  2. 编写 isVampire(int i)函数,返回Vampire类型数据,当Vampire.isV为true时代表当前数是吸血鬼数,把大问题分隔成多个小问题逐一解决
  3. 因为有了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,上面有很好的方法。

如有错误请指正。谢谢

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值