4位数吸血鬼数字算法

原创
2017/07/02 01:01
阅读数 408

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 + " 个");
	}

 

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部