在第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;
}
}
}
}
}
}
}
}
}