很明显,21位的这个数字是一个超级大的。即使使用java中的超级整型BigInteger一个一个遍历也是非常吃力的
解法:
遍历出 0 - 9 这 10 个数,每个数出现的次数。
然后求出和。
去判断求出的和,是否 其中 0-9 这10个数出现的次数 是否匹配
import java.io.BufferedReader;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static BigInteger[] mly = new BigInteger[10];
static int[] weight = new int[10];
static int countNUM = 0;
public static void main(String[] args){
initNum();
all(0,21);
System.out.println(countNUM);
}
public static void all(int index,int count){
if(index==9){
weight[9] = count;
if(check()){
countNUM++;
}
}else{
for(int i=0;i<=count;i++){
weight[index] = i;
all(index+1,count-i);
}
}
}
public static boolean check(){
BigInteger resNum = BigInteger.ZERO;
for(int i=0;i<10;i++){
resNum = resNum.add(mly[i].multiply(new BigInteger(weight[i]+"")));
}
int[] tempnum = new int[10];
String strNum = resNum.toString();
for(int i=0;i<strNum.length();i++){
tempnum[strNum.charAt(i)-'0']++;
}
for(int i=0;i<10;i++){
if(tempnum[i]!=weight[i])return false;
}
System.out.println(strNum);
return true;
}
public static void initNum(){
for(int i=0;i<10;i++){
mly[i] = (new BigInteger(""+i)).pow(21);
}
}
}