今天看到JAVA编程思想第4章一道练习题,觉得蛮有趣,顺手敲了一遍代码,借机分享出来,欢迎大家批评指正。
题目:吸血鬼数字是指位数为偶数的数字,可以由一堆数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。以两个0结尾的数字是不允许的,例如,下列数字都是“吸血鬼”数字:
1260=21*60
1827=21*87
2187=27*81
写一个程序,找出4位数的所有吸血鬼数字
思路和代码如下:
/**
* 设"吸血鬼"数字为val,两个两位数分别为i和j,则val = i * j
* 大致思路:尽可能提高算法效率,减少循环次数,i(10 =< i < 100)和
j (i =< j < 100, i <= j避免重复乘积)分别嵌套for循环,得到乘积val= i * j;
将val、i和j的数字分别放到两个数组中,分别排序后利用array.sort比较是否相等,相等则满足条件
* 要实现“吸血鬼”数字,需要满足以下条件:
* 1、val为4位数,由于两个两位数相乘的结果可能为3或者4位数,为了得到4位数,可以限定j的循环范围,
因为满足1000 =< i * j < 10000 且 j < 100 且 i <= j, 所以 max(1000/i, i) =< j < 100
* 2、i和j中数字和val中的4位数字相同,顺序任意
* 3、val不能以两个0结尾,若val除以100余数为0说明末尾两个数字为0
*/
private static void calXxg() {
// 统计“吸血鬼”个数
int sumNum = 0;
for(int i = 10;i <100; i++) {
int start = Math.max(1000/i, i);
int end = 100;
for(int j = start; j < end; j++) {
int val = i * j;
// 若val除以100余数为0说明末尾两个数字为0,跳过
if(val % 100 == 0) {
continue;
}
// 得到val的4位数字
int a = val / 1000;
int b = val / 100 % 10;
int c = val / 10 % 10;
int d = val % 10;
// 得到i的两位数字
int i1 = i / 10;
int i2 = i % 10;
// 得到j的两位数字
int j1 = j / 10;
int j2 = j % 10;
int[] array = new int[]{a,b,c,d};
int[] array1 = new int[]{i1,i2,j1,j2};
Arrays.sort(array);
Arrays.sort(array1);
if(Arrays.equals(array1, array)){
sumNum++;
System.out.println("" + val + "=" + i + "*" + j);
}
}
}
System.out.println("吸血鬼个数为:" + sumNum);
}
输出结果如下: