4位数吸血鬼数字算法

java编程思想(第四版) 第四章的练习10.

自己做的,如果还有可优化的地方请多指教

/**
	 * 吸血鬼数字是指位数为偶数的数字,由一对数字相乘而得到
	 * 且这对数字各包含一半位数的数字.排序不限,但是不允许
	 * 以00结尾
	 * 如:
	 * 1260 = 21 * 60
	 * 1827 = 21 * 87
	 * 
	 * 相乘的时候只要用前一个因数和大于等于他的所有因数相乘就行了,
	 * 因为如果还是从10开始乘就会出现重复
	 * 如当a = 10,b = 11 和 a = 11,b = 10的情况
	 */
	@Test
	public void getXiXueGui() {
		// 既然要得到的是4位数的吸血鬼数字,那么两个因数必然都是2位数
		// 所以必须是大于10 且小于 100
		int a = 10;
		int b = 10;
		int num = 0; // 计数器
		boolean boo = true;
		// 只要a和b都小于100就肯定不会出现9999以上的数字,因为最大99 * 99 = 9801
		while (a < 100 && b < 100) {
			int c = a * b;
			// 相乘结果是4位数,开始进一步判断是否吸血鬼数字
			if (c > 1000 && c%100 != 0) {
				String ab = a + "" + b;// 将两个因数物理拼接起来
				String cc = c + "";
				
				for (int i = 0; i < ab.length(); i++) {
					char at = ab.charAt(i);
					String cstr = String.valueOf(at);
					// 只要有一个数字没有在乘积中就不是吸血鬼数字
					if (!cc.contains(cstr)) {
						boo = false;
						break;
					} else { 
						/* 如果本次在因数字符串中的数字在乘积字符串中包涵,那么就把乘积字符串中的这个字符删掉.
						 * 避免同一个字符被重复匹配的问题
						 */
						cc = cc.replaceFirst(cstr, "");
					}
				}
				
				if (boo) {
					num++;
					System.out.println("吸血鬼数字:" + c + " = " + a + " + " + b);
				}
			}
			
			// 如果b还小于99就让b+1,否则a+1,b = a + 1 + 1开始新一轮计算
			if (b < 99) {
				b++;
			} else {
				a++;
				b = a;
			}
			// 重置标记
			boo = true;
		}
		System.out.println("4位数吸血鬼数字共有: " + num + " 个");
	}

 

转载于:https://my.oschina.net/MrBamboo/blog/1110157

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值