日期:2014-05-20 浏览次数:20848 次
import java.util.*;
public class Vampire {
public static void main(String [] args){
int [] a = new int [4]; //数组a中存放四位数的每位数字
int [][] b = new int [4][3]; //存放的四个数字可以12个两位数,以二维数组形式存放
for(int i = 1000; i <10000; i++){
int count = 0; //count 用于判断条件
int nu = i; //临时变量,代替当前i值
for(int j = 0 ; j < 4; j++){ //取出四位数中的每位数字,存放在数组a中
a[j] = nu % 10; //取余,即取末尾数字
nu = nu / 10; //nu迭代,略去最后一位数字
}
//将取出来的四位数字,组合成两位数,存放在二位数组中
//比如四位数字a,b,c,d,数组{a,b,c,d},组成的12个两位数是
// ab,ba,ca,da
// ac,bc,cb,db
// ad,bd,cd,dc
for(int j = 0; j < 4; j++){
int m = 0;
for(int k = 0; k < 3 ; k++){
if(m == j) //每个数字不能同自己组合,比如没有aa,bb,cc,dd
m++; //碰到自身,m++,跳过自己与自己组合的可能性
if( m==4 ) //当 m=j=3时,即到数字d时,通过上一步m++变为4,这时m已经越界了
break; //用break语句跳出循环,防止越界,因为 a[4] 不存在
b[j][k] = a[j]*10 + a[m];
m++; // m++,b[0][3]跳到b[1][0],b[1][3]跳到b[2][0],b[2][3]跳到b[3][0]
}
}
//鉴于二维数组的操作性,将二维数组里的内容赋到一维数组中
int n = 0;
int [] c = new int [12]; //实例一维数组 c[12]
for(int k = 0; k < 4; k++){
for(int l = 0 ; l < 3; l++){
c[n] = b[k][l]; //将二维数组内容逐个赋给一维数组
n++;
}
}
Arrays.sort(c); //将数组排序,升序
Arrays.sort(a); //将数组排序,升序
//判别吸血鬼数字
for(int j = 1 ; j < 12 ;j++){ //c[j] 从第二项开始
for(int k = 0; k < j ; k++){ //c[k] 从第一项开始,避免重复,k<j
if( i == c[j]*c[k]){ //第一个满足条件,i==c[j]*c[k]
int cj = c[j]; //临时变量cj 代替c[j]
int ck = c[k]; //临时变量ck 代替c[k]
int [] aa = new int [4]; //实例数组aa,用于存放c[j],c[k]包含的
// 四个数字,用于同数组a比较
aa[0] = cj % 10; //取c[j]个位数字
cj = cj / 10; //
aa[1] = cj; //取c[j]十位数字
aa[2] = ck % 10; //取c[k]个位数字
ck = ck /10; //
aa[3] = ck; //取c[k]十位数字
Arrays.sort(aa); //对数组aa排序,升序,便于同数组a比较
if(Arrays.equals(a, aa)){ // 比较数组a同aa的内容是否相同
if(!(c[j] % 10 == 0 && c[k] % 10 == 0)){ //剔除两个数都是以0结尾的
count++; //若找到count++
System.out.println("vampire number : " + i +
"\nmultiplying by : " + c[j] + " and " + c[k]);
}
}
}
}
}
if(count > 0)
System.out.println();
}
}
}