4位吸血鬼数字的实现代码与解释

    今天在《Java编程思想》第四章中看到一道练习题,写程序找到所有的4位吸血鬼数字。因为第四章是讲控制流程,一开始始终将思路局限于利用循环进行穷举,但越想越复杂,最后查阅了相关资料,总结出了目前比较高效的实现方法。

import java.util.Arrays;
/**
 * 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字钟选取的数字可以任意排序。
 * 以两个0结尾的数字是不允许的。例如:1260=21*60,1260是吸血鬼数字。
 * 本程序找出了4位数的所有吸血鬼数字。
 * @author Enzuo
 *
 */
public class Prictice10 {
	public static void main(String[] args){
		int number,i,j;
		int calCount = 0, index = 0;
		//i的值介于10和99之间
		for(i = 10; i < 100; i++){
			//j的起始值满足条件:1、为避免重复应比i值大;2、i*j的值大于1000
			int from = Math.max(1000/i, i+1);
			//j的终值满足条件:1、比100要小;2、i*j的值小于10000
			int to = Math.min(10000/i, 100);
			for(j = from; j < to; j++){
				number = i * j;
				//此处为提高算法效率,提取了两个筛选条件
				//1、以两个0结尾的数字是不允许的,即number%100==0的情况
				//2、设number=i*j=abcd=1000a+100b+10c+d,i和j分别由a、b、c、d四个数字两两组合,可设
				//  i=10a+c,j=10b+d,则number-i-j=900a+90b+9c,能被9整除,其他情况亦如此,可推出
				//  (number-i-j)%9==0是吸血鬼数字的必要条件,不满足该条件即可排除
				if(number % 100 == 0 || (number-i-j) % 9 != 0)
					continue;
				calCount++;
				//对组成number的四个数字按照从小到大排序
				char[] char1 = String.valueOf(number).toCharArray();
				Arrays.sort(char1);
				//对组成i和j的四个数字按照从小到大排序
				char[] char2 = (String.valueOf(i) + String.valueOf(j)).toCharArray();
				Arrays.sort(char2);
				//排序后的序列相同,则满足吸血鬼数字的条件
				if(Arrays.equals(char1, char2)){
					System.out.println("第" + ++index + "组: " + number + "=" + i + "*" + j);
				}
			}
		}
		System.out.println("共比较" + calCount + "次,找到" + index + "组吸血鬼数");
	} 
}

最终运行结果如下:

第1组: 1395=15*93
第2组: 1260=21*60
第3组: 1827=21*87
第4组: 2187=27*81
第5组: 1530=30*51
第6组: 1435=35*41
第7组: 6880=80*86
共比较232次,找到7组吸血鬼数



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值