日期:2014-05-20 浏览次数:20685 次
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(); } } }