P75,练习10
1994年柯利弗德·皮寇弗在Usenet社群sci.math的文章中首度提出吸血鬼数。后来皮寇弗将吸血鬼数写入他的书Keys to Infinity的第30章。
吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。
以两个0结尾的数字是不允许的,例如,下列数字都是“吸血鬼”数字:
1260 = 21 * 60 1827 = 21 * 87 2187 = 27 * 81
找出所有四位数的吸血鬼数字
首先。四位数的吸血鬼数字必须是两个两位数的乘积,可以用两层循环,得到所有两位数的乘积。最关键的部分是判断该乘积是不是由这两个两位数的数字所组成。我用的方法是将数字转换为字符串,然后将字符串转换为字符数组,对两个字符数组进行排序,比较排序之后的结果是不是相等。
代码如下:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class XiXueGuiNumber {
public void calcu(){
int first = 10;
int second = 10;
int multi;
for (; first < 100; first++) {
for (second = 100; second >= first; second--) {
multi = first * second;
if (multi % 100 == 0) {
continue;
}
if (multi > 9999) {
continue;
}
isXiXueGui(multi, first, second);
}
}
}
public void isXiXueGui(int toTest,int first,int second){
List<Character> cheng = new ArrayList<Character>();
for (Character character : String.valueOf(first).toCharArray()) {
cheng.add(character);
}
for (Character character : String.valueOf(second).toCharArray()) {
cheng.add(character);
}
List<Character> result = new ArrayList<Character>();
for (Character character : String.valueOf(toTest).toCharArray()) {
result.add(character);
}
Collections.sort(cheng);
Collections.sort(result);
if (cheng.equals(result)) {
System.out.println(toTest + " = " + first + " * " +second);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
XiXueGuiNumber xiXueGuiNumber = new XiXueGuiNumber();
xiXueGuiNumber.calcu();
}
}
网上还找到一篇文章也是吸血鬼数字的算法,要看点这里
原文地址:http://www.cnblogs.com/reading-coding/p/3841821.html