吸血鬼数

它是从合数v开始,该合数为n位数(且n为偶数),然后用v的各个数字组成两个n/2位数的正整数x和y(x和y不能同时以0为个位数),若x和y的积刚好就是v,那么v就是吸血鬼数,而x和y则称为尖牙(fangs)。

假设四位的vampire digit  n =  1000a+100b+10c+d; 则它的两个尖牙x=10a+c;y=10b+d;//也可以x=10b+c,y=10d+a,可以任意组合
即 n=100(10a+b)+(10c+d)=x*y; n%9=3; x+y=10a+c+10b+d x*y-x+y=900a+90b 两边同时%9 得x*y%9=(x+y)%9
//: ch4_10/Vampire.java
/** @version 1.0
  * @author  Tinking in java
  */

/*吸血鬼数算法,假定吸血鬼数为n,x,y为尖牙
  *一.给定所求吸血归属的范围
  *二.确定是否时吸血鬼数
  *1.if (x*y)%9!=(x+y)%9,不是吸血归属
  *2.if 是吸血归属
  *3.取出n x y 三个的每位数字
  *4.if n 的每位数字 全部是由x y 的每位数字组成 ,确定时吸血鬼数
  */

public class Vampire
{
    public static void main(String[] args)
    {
        vampire();
    }
    static void vampire()
    {
        int x=0;
        int y=0;
        int count = 0;
        int [] num =  new int[4];
        int [] vam =  new int[4];
        for(x=10;x<=100;x++)
            for(y=10;y<=99;y++)
            {
                if((x*y)%9!=(x+y)%9)
                    continue;
                count = 0;
                int product = x*y;
                vam[0] = product/1000; //千位
                vam[1] = (product%1000)/100;//百位
                vam[2] = (product%1000%100)/10;   //十位
                vam[3] = product%1000%100%10;   //个位
                num[0] = x/10;//十位
                num[1] = x%10;//个位
                num[2] = y/10;
                num[3] = y%10;
                for(int i = 0;i<4;i++)
                    for(int j = 0;j<4;j++)
                        if(vam[i]==num[j])
                        {
                            count++;
                            vam[i]=-1;  
                            num[j]=-2; //防止重复计算
                       
                           if(count == 4)
                             System.out.println("vampire = "+product+",x = "+ x + ",y = "+ y);
                       }
            }
    }
                
}

 

posted @ 2018-11-25 13:10  江期玉  阅读(337)  评论(0编辑  收藏  举报