Thinking in Java第四章练习10
吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。
以两个0结尾的数字是不允许的,例如,下列数字都是“吸血鬼数字”:
1260=21*60
1827=21*87
2187=27*81
写一个程序,找出4位数的所有吸血鬼数字(Dan Forhan推荐)。
我的解题思路就是轮询所有的2位数组合,比较乘积和这对数字的各位数的组合,这里的比较有两种方式,一种是拆分成数字比较,一种是拆分成字符,这里分析了一下两种方法的执行效率,代码如下:
package control;
import java.util.Arrays;
public class Exercise10
{
public static void main(String[] args)
{
long startTime = System.currentTimeMillis();
findVampireNumbers("int");
long endTime = System.currentTimeMillis();
System.out.println("compare in int :" + (endTime - startTime));
startTime = System.currentTimeMillis();
findVampireNumbers("char");
endTime = System.currentTimeMillis();
System.out.println("compare in char:" + (endTime - startTime));
}
private static void findVampireNumbers(String way)
{
for (int i = 10; i < 100; i++) {
for (int j = i; j < 100; j++) {
int product = i * j;
if (product < 1000) {
continue;
}
if (product > 9999) {
break;
}
boolean isVampire;
if (way.equals("int")) {
isVampire = compareInInt(i, j, product);
} else {
isVampire = compareInChar(i, j, product);
}
if (isVampire) {
System.out.println(i + "*" + j + "=" + product);
}
}
}
}
private static boolean compareInInt(int i, int j, int product)
{
int[] checkDigit = splitNum(i * 100 + j);
int[] productDigit = splitNum(product);
int matched = 0;
for (int one :
productDigit) {
for (int k = 0; k < 4; k++) {
if (checkDigit[k] == one) { matched ++;
checkDigit[k] = -1;
break;
}
}
}
return matched == 4;
}
private static int[] splitNum(int i)
{
int[] result = new int[4];
for (int j = 0; j < 4; j++) {
result[j] = i % 10;
i = i / 10;
if (i <= 0) {
break;
}
}
return result;
}
private static boolean compareInChar(int i, int j, int product)
{
String productStr = Integer.toString(product);
String checkStr = Integer.toString(i) + Integer.toString(j);
char[] productChar = productStr.toCharArray();
char[] checkChar = checkStr.toCharArray();
Arrays.sort(productChar);
Arrays.sort(checkChar);
return Arrays.equals(productChar, checkChar);
}
}/*output:
15*93=1395
21*60=1260
21*87=1827
27*81=2187
30*51=1530
35*41=1435
80*86=6880
compare in int :6
15*93=1395
21*60=1260
21*87=1827
27*81=2187
30*51=1530
35*41=1435
80*86=6880
compare in char:25
*/
结论:
- 用int比较,代码效率更高
- 用char比较,代码更简洁,可读性更强
网友评论