所谓“吸血鬼数字”就是指位数为偶数的数字(我们算得是4位的),可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数字,其中从偶数位数字中选取的数字可以任意排列。以两个0截尾的数字是不允许的。
例如:1260=21*60
1827=21*87
2187=27*81
算法来源网上:
- package org.idcn.jse;
- public class Vampire{
- /**
- * 吸血鬼数字算法
- * 如:12*60=1260
- * YangL.
- */
- public static void main(String[] args) {
- String[] ar_str1, ar_str2;
- int sum = 0;
- for (int i = 10; i < 100; i++) {
- for (int j = i + 1; j < 100; j++) {
- int product= i * j;
- if (product< 1000 || product> 9999)
- continue; // 积小于1000或大于9999排除,继续下一轮环
- if(product%100 == 0 || (product-i-j)%9) != 0)
- continue;//关于解释见后面
- ar_str1 = String.valueOf(product).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)) {
- // 排序后比较,为真则找到一组
- sum++;
- System.out.println("第" + sum + "组: " + i + "*" + j + "="
- + product);
- }
- }
- }
- System.out.println("共找到" + sum + "组吸血鬼数");
- }
- }
假设val = 1000a + 100b + 10c + d, 拆分成val = x * y
而x是a、b、c、d中两个的线性组合,y是另两个的线性组合,系数分别是10和1
则val-x-y
=val-m1*a-m2*b-m3*c-m4*d //m1\m2\m3\m4 是10或者是1
=1000a + 100b + 10c + d-m1*a-m2*b-m3*c-m4*d
=(1000-m1)a+(100-m2)b+(10-m3)c+(1-m4)d
1000-m1等900或者999,能被9整除
100-m2等90或者99,能被9整除
10-m3等0或者9,能被9整除
1-m4等-9或者0,能被9整除
所以(1000-m1)a+(100-m2)b+(10-m3)c+(1-m4)d能被9整除
得到val-x-y能被9整除
而x是a、b、c、d中两个的线性组合,y是另两个的线性组合,系数分别是10和1
则val-x-y
=val-m1*a-m2*b-m3*c-m4*d //m1\m2\m3\m4 是10或者是1
=1000a + 100b + 10c + d-m1*a-m2*b-m3*c-m4*d
=(1000-m1)a+(100-m2)b+(10-m3)c+(1-m4)d
1000-m1等900或者999,能被9整除
100-m2等90或者99,能被9整除
10-m3等0或者9,能被9整除
1-m4等-9或者0,能被9整除
所以(1000-m1)a+(100-m2)b+(10-m3)c+(1-m4)d能被9整除
得到val-x-y能被9整除