吸血鬼数字

在第4版《java编程思想》第4章练习10介绍了一个吸血鬼数字,即位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位的数字,数字可以任意排序,且末尾两位不能为0。找出4位数的所有吸血鬼数字。(4位数的吸血鬼数有7个: 1260, 1395, 1435, 1530, 1827, 2187, 6880)

思路:将这个4位数看成一个对象,这个对象由4个数字组成,每个数字0-9随机组合,且满足以下条件:
1、末尾两位不能同时为0;
2、4个数字组成的对=其中任意2个数字组合成2位数*剩下2个数字任意组合的2位数;

我们将这个4位数对象arr用含有4个元素的一维数组表示{s,k,t,b},那么sktb就等于sktb中抽取的任意2位乘以剩下的两位,代码如下://代码较冗长,但是完全利用了书中本练习前的中断。

public class Vampire {
 public static void main(String[] args){
  for(int i=1000;i<=9999;i++){
   int arr[]=new int[4];
   int b=i;
   for(int j=0,k=1000;j<arr.length;j++,k=k/10){
    arr[j]=b/k;//将4位数拆分成4个1位数装进数组
    b=b%k;
   }
   if(arr[arr.length-2]==0&&arr[arr.length-1]==0)continue;
   Admin ifx=new Admin();
   ifx.find(arr);
  }
 } 
}
class Admin{
 void find(int arr[]){
  int x=arr[0]*1000+arr[1]*100+arr[2]*10+arr[3]*1;
  mark: //1260=21*60也可以等于60*21,标签的作用是让循环一次有效就好
   for(int i=0;i<arr.length;i++){
    for(int j=0;j<arr.length;j++){
     if(i==j)continue;
     for(int k=0;k<arr.length;k++){
      if(i==k)continue;
      if(k==j)continue;
      for(int w=0;w<arr.length;w++){
       if(w==k&&w==j&&w==i)continue;
       if(x==(10*arr[i%4]+arr[j%4])*(10*arr[k%4]+arr[w%4])){
        System.out.println(x+"="+arr[i%4]+arr[j%4]+"*"+arr[k%4]+arr[w%4]);
        break mark;
       }
      }
     }
    }
   }
 } 
}

思路拓展:按照吸血鬼数字的定义,那么6位数的吸血鬼数字怎么获得呢?只需要改下数组长度,增加2层循环嵌套就好。代码如下:

public class Vampire {
 public static void main(String[] args){
  for(int i=100000;i<=199999;i++){
   int arr[]=new int[6];
   int b=i;
   for(int j=0,k=100000;j<arr.length;j++,k=k/10){
    arr[j]=b/k;//将4位数拆分成4个1位数装进数组
    b=b%k;
   }
   if(arr[arr.length-2]==0&&arr[arr.length-1]==0)continue;
   Admin ifx=new Admin();
   ifx.find(arr);
  }
 } 
}
class Admin{
 void find(int arr[]){
  int x=arr[0]*100000+arr[1]*10000+arr[2]*1000+arr[3]*100+arr[4]*10+arr[5]*1;
  mark: //1260=21*60也可以等于60*21,标签的作用是让循环一次有效就好
   for(int i=0;i<arr.length;i++){
    for(int j=0;j<arr.length;j++){
     if(i==j)continue;
     for(int k=0;k<arr.length;k++){
      if(k==i)continue;
      if(k==j)continue;
      for(int w=0;w<arr.length;w++){
       if(w==k&&w==j&&w==i)continue;
        for(int y=0;y<arr.length;y++){
        if(y==i)continue;
        if(y==j)continue;
        if(y==k)continue;
        if(y==w)continue;
        for(int z=0;z<arr.length;z++){
         if(z==i)continue;
         if(z==j)continue;
         if(z==k)continue;
         if(z==w)continue;
         if(z==y)continue;
         if(x==(100*arr[y%6]+10*arr[i%6]+arr[j%6])*(100*arr[z%6]+10*arr[k%6]+arr[w%6])){
          System.out.println(x+"="+arr[y%6]+arr[i%6]+arr[j%6]+"*"+arr[z%6]+arr[k%6]+arr[w%6]);
          break mark;
         }
        }
       }
      }
     }
    }
   }
 } 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值