仙花数 是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。 import java.util.Date; public class ArmstrongNumber { public static long[] BIT_NUMBERS = new long[23]; static { for(int i = 0; i < 10; i ++){ BIT_NUMBERS[i] = calCBit(10, i-1); } } /** * 计算次方 * */ public static long calc(int cnum){ long numbers = 1; for(int i = 0; i < cnum; i ++){ numbers *= 9; } return numbers; } /** * @param args */ public static void main(String[] args) { //System.out.println(isTrue(153,(byte)3)); //System.out.println(Long.bitCount(23)); //System.out.println(isTrue(4234,(byte)calBit(153))); Date dateBegin = new Date(); for(long i = 101; i < 100000000l; i ++){ if(isTrue(i,(byte)calBit(i))){ //System.out.println(i); } } Date dateEnd = new Date(); System.out.println(dateBegin + " " + dateEnd); } /** * 判断一个数是否是水仙花数 * */ private static boolean isTrue(int number){ String numstr = String.valueOf(number); int length = numstr.length(); int number0 = 0; for(int i = 0; i < length; i ++){ //计算次方 int b3bit = (int)Math.pow(Byte.parseByte(numstr.charAt(i)+""), length); number0 += b3bit; } //是否相等 if(number == number0){ return true; }else{ return false; } } /** * 法二 * */ private static boolean isTrue(long number,byte bit){ long sum = 0; long number0 = number; for(int i = 0; i < bit; i ++){ //取位数字 //从最高位开始取 int numbit = 0; if(number0 > 10){ long num = BIT_NUMBERS[bit-i];//calCBit(10,bit-i-1); numbit = (int)(number0/num); number0 = number0 - num * numbit; }else{ numbit = (int)number0; } //计算该位的次方 sum += calCBit(numbit,bit); } if(sum == number){ return true; }else{ return false; } } /** * 计算次方 * */ private static long calCBit(int num,int bit){ long temp = 1; for(int i =0; i < bit; i ++){ temp *= num; } return temp; } private static int calBit(long num){ for(int i = 3; i < 20; i ++){ int bnum = (int)(num / BIT_NUMBERS[i]); if(bnum > 0 && bnum < 10){ return i; } } return 0; } }