import java.util.*;
import java.math.*;
public class 水仙花数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
BigInteger[] mm=new BigInteger[10];
for(int i=0;i<=9;i++){
BigInteger base=BigInteger.valueOf(i);
mm[i]=base.pow(21);
}
int[] nn=new int[10];
backtrace(0,0,nn,mm);
}
public static void backtrace(int num,int use,int[] nn,BigInteger[] mm){
if(num==9){
nn[9]=21-use;
jisuan(nn,mm);
return;
}
for(int i=0;i<=21-use;i++){
nn[num]=i;
backtrace(num+1,use+i,nn,mm);
}
}
public static void jisuan(int[] nn,BigInteger[] mm){
BigInteger bi=BigInteger.ZERO;
for(int i=0;i<=9;i++){
bi=mm[i].multiply(new BigInteger(nn[i]+"")).add(bi);
}
String ss=bi+"";
if(ss.length()!=21) return;
int[] newnn=new int[10];
// System.out.println(bi);
for(int p=0;p<=9;p++){
newnn[p]=0;
}
for(int j=0;j<ss.length();j++){
newnn[ss.charAt(j)-'0']++;
}
for(int i=0;i<10;i++){
if(nn[i]!=newnn[i]) return;
}
System.out.println(bi);
}
}
注:我们利用表的形式,记录了1-9的21次方,然后利用1-9出现的次数进行递归。