吸血鬼数字

所谓“吸血鬼数字”就是指位数为偶数的数字(我们算得是4位的),可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数字,其中从偶数位数字中选取的数字可以任意排列。以两个0截尾的数字是不允许的。

例如:1260=21*60          

   1827=21*87 

           2187=27*81 


算法来源网上:

   

  1. package org.idcn.jse;   
  2.   
  3. public class Vampire{   
  4.     /**  
  5.      * 吸血鬼数字算法  
  6.      * 如:12*60=1260  
  7.      * YangL.  
  8.      */   
  9.     public static void main(String[] args) {   
  10.         String[] ar_str1, ar_str2;   
  11.         int sum = 0;   
  12.         for (int i = 10; i < 100; i++) {   
  13.             for (int j = i + 1; j < 100; j++) {   
  14.                 int product= i * j;   
  15.                 if (product1000 || product9999)   
  16.                     continue// 积小于1000或大于9999排除,继续下一轮环   
  17. if(product%100 == 0 || (product-i-j)%9) != 0)
  18.      continue;//关于解释见后面
  19.                 ar_str1 = String.valueOf(product).split("");   
  20.                 ar_str2 = (String.valueOf(i) + String.valueOf(j)).split("");   
  21.                 java.util.Arrays.sort(ar_str1);   
  22.                 java.util.Arrays.sort(ar_str2);   
  23.                 if (java.util.Arrays.equals(ar_str1, ar_str2)) {   
  24.                     // 排序后比较,为真则找到一组   
  25.                     sum++;   
  26.                     System.out.println("第" + sum + "组: " + i + "*" + j + "="   
  27.                             + product);   
  28.                 }   
  29.             }   
  30.         }   
  31.         System.out.println("共找到" + sum + "组吸血鬼数");   
  32.     }   


假设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整除

你可能感兴趣的:(string,算法,c)