吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各报刊乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。以两个0结尾的数字是不允许的。

例如:

           1260=21*60;

           1827=21*87;

           2187=27*81;

写一个程序,找出4位数的所有吸血鬼数字。

import java.util.Arrays;

public class VampireNumber{
       public static void main(String[] args){
           long s1=System.nanoTime();
           fun1();
           long e1=System.nanoTime();
           System.out.println(e1-s1);

           long s2=System.nanoTime();
           fun2();
           long e2=System.nanoTime();
           System.out.println(e2-s2);

           long s3=System.nanoTime();
           fun3();
           long e3=System.nanoTime();
           System.out.println(e3-s3);        
       }

       public static void fun1(){
             int m=0;             
             String[] temp1=new String[4];
             String[] temp2=new String[4];
             for(int i=10;i<100;i++){
                 for(int j=i;j<100;j++){
                    m=i*j;
                    if(m<1000||m>9999||(m%9!=(i+j)%9)){
                        continue;
                    }  
                    temp1=String.valueOf(m).split("");
                    temp2=(String.valueOf(i)+String.valueOf(j)).split("");
                    Arrays.sort(temp1);
                    Arrays.sort(temp2);
                    if(Arrays.equals(temp1,temp2)){
                        System.out.println(m);
                    }
                    
                 }
             }
       }

       public static void fun2(){
             int m;
             for(int i=10;i<100;i++){
                 for(int j=i;j<100;j++){
                     m=i*j;
                     if(m<1000||m>9999||(m%9!=(i+j)%9)){
                         continue;
                     }
                    int[] a={m/1000,m/100%10,m/10%10,m%10};
                    int[] b={i/10,i%10,j/10,j%10};
                     Arrays.sort(a);
                     Arrays.sort(b);
                     if(Arrays.equals(a,b)){
                         System.out.println(m);
                     }
                 }
             }
       }
 
      public static void fun3(){
          int m;
          for(int i=10;i<100;i++){
             for(int j=i;j<100;j++){
                m=i*j;
                if(m<1000 || m>9999 ||(m%9!=(i+j)%9)){
                    continue;
                }
                int[] a={m/1000,m/100%10,m/10%10,m%10};
                int[] b={i/10,i%10,j/10,j%10};
                int count=0;
                for(int x=0;x<a.length;x++){
                    for(int y=0;y<b.length;y++){
                       if(a[x]==b[y]){
                          count++;
                          a[x]=-1;
                          b[y]=-2;
                          if(count==4){
                               System.out.println(m); 
                          }
                       }
                    }
                }
             }
          }
      }
}

三种方法中,运行效率依次为fun3(),fun2(),fun1()。如果x*y是吸血鬼数字,那么(x*y)%9==(x+y)%9。

 posted on 2018-05-25 15:38  会飞的金鱼  阅读(261)  评论(0)    收藏  举报