妈的果然让我做出来了, 我的特等奖啊啊啊啊啊啊啊啊啊

 

 /** * 求21位的水仙花数, 一分钟内算出答案 */ import java.math.BigInteger; import java.util.Arrays; public class ArmstrongNumber { static class BigNumber { // 保存0到9的n次方结果 static int[][] nPower = new int[10][]; static { for( int i = 0; i < 10; i++ ) { BigInteger bi = new BigInteger(Integer.toString(i)); char[] powNum = bi.pow(n).toString().toCharArray(); // 把 String 转成 int 数组 nPower[i] = new int[powNum.length]; for( int j = 0; j < nPower[i].length; j++ ) nPower[i][j] = powNum[nPower[i].length – j – 1] – ‘0’; } } int[] innerNum = new int[n]; // 用数组以表示大数 // 与另一个大数相加, 如果结果的位数大于n则返回false, 表示此数不是水仙花数 boolean add(int[] addend) { // 数组相加 int len = innerNum.length < addend.length ? innerNum.length: addend.length; for( int i = 0; i < len; i++ ) innerNum[i] += addend[i]; // 进位处理 for( int i = 0; i < innerNum.length – 1; i++ ) if( innerNum[i] >= 10 ) { innerNum[i] -= 10; innerNum[i + 1]++; } // 返回最高位是否在范围内 return innerNum[innerNum.length – 1] < 10; } // 判断两个数组包含的数字是否一样 public boolean equals(int[] a) { int[] aCount = new int[10]; for( int i : a ) aCount[i]++; int[] numCount = new int[10]; for( int i : innerNum ) numCount[i]++; return Arrays.equals(aCount, numCount); } // 判断此数字组合是否能组成水仙花数 boolean isSxNum(int[] a) { for( int n : a ) if( !add(nPower[n]) ) return false; return equals(a) && innerNum[innerNum.length – 1] != 0; } @Override public String toString() { StringBuilder builder = new StringBuilder(); for( int i = innerNum.length – 1; i >= 0; i– ) builder.append(innerNum[i]); return builder.toString(); } } static int n = 21; public static void main(String[] args) { System.out.println(“开始..”); int[] a = new int[n]; long start = System.currentTimeMillis(); traverse(a, 0, a.length); long end = System.currentTimeMillis(); System.out.println((end – start) / 1000.0 + “秒”); } // 列举出n位所能包含的所有数字组合, 多重循环的递归实现 static void traverse(int[] a, int start, int layer) { if( layer == 0 ) { BigNumber num = new BigNumber(); if( num.isSxNum(a) ) System.out.println(num); return; } layer–; for( int i = start; i <= 9; i++ ) { // System.out.println(layer+”,”+i); a[layer] = i; traverse(a, i, layer); } } }

 

点赞