关于吸血鬼数字算法问题,我也是读《java编程思想》中遇到的,觉得很有意思。于是,就去做了做。但因为我的粗心,读题的时候忽略了点问题,所以导致我的思路出现了岔口!(当时的思路就是想着把一个4位数拆分成两个2位数,存在数组的形式找出吸血鬼数字,也就是官方答案的那种解法)
虽然我没有解出来,但是我对吸血鬼数字的算法问题做了总结、整理,也搜集了很多解法,并给他们编写了大量的注释,为让你们看的更明白。注释中如有错误,请来指正,我将虚心更改!
《Java编程思想》中的Dan Forhan推荐
什么是“吸血鬼”数字呢?
“吸血鬼”数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积一半位数的数字,其中从最初的数字中选取的数字可以任意排序。(以两个0结尾的数字是不允许的),例如下列数字都是“吸血鬼”数字
1260=2160
1827=2187
2187=27*81
写一个程序,找出4位数的所有吸血鬼数字!
解法一、字符串拆分法
思路:虽然我不知道这是谁写的,但是我的确佩服他的解法。
这个解法,利用了字符串的拆分的性质,将4位数拆分成两个2位数,再对它进行字符的拆分、比较得出的吸血鬼数字!
从数据看来比较的次数是3271次
/**
*
* 吸血鬼数字算法
*/
public class TestVampireNumber {
public static void main(String[] args) {
//创建存放两个两位数的字符串数组
String[] ar_str1, ar_str2;
int sum = 0; //吸血鬼数字个数计数器
int count = 0; //算法循环次数计数器
for (int i = 10; i < 100; i++) {
//寻找的第一个两位数
for (int j = i + 1; j < 100; j++) {
//寻找的第二个两位数
int i_val = i * j; //两个两位数的乘积
if (i_val < 1000 || i_val > 9999)
continue; //积小于1000或大于9999排除,继续下一轮环
count++; //计算循环次数
ar_str1 = String.valueOf(i_val).split(""); //将乘积后的数字拆分成单个字符串并放在字符串数组中
ar_str2 = (String.valueOf(i) + String.valueOf(j)).split(""); //同样将两个两位数拼成一个字符串并拆分成单个字符串放在字符串数组中
java.util.Arrays.sort(ar_str1); //对两个数组中的元素进行排序
java.util.Arrays.sort(ar_str2);
if (java.util.Arrays.equals(ar_str1, ar_str2)) {
//乘积排序与两个两位数的所有单个字符串进行比较
// 排序后比较,为真则找到一组(也就是说他们比较左边四个数右边四个数比较完全相等的时候返回true,记为一组吸血鬼数字)
sum++