您的位置:首页 > 编程语言

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

2015-01-19 21:25 183 查看
今天在《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组吸血鬼数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: