package A类有价值的回顾的;
import java.math.BigInteger;
public class ShuixianhuaTest {
private static BigInteger[] base = new BigInteger[10];
private static BigInteger calcu(int n){
BigInteger a = BigInteger.ONE;
for(int i=0;i<21;i++){//21位,要进行21次幂的计算
a = a.multiply(BigInteger.valueOf(n));
}
return a;
}
private static void test(int[] a){
BigInteger bn = BigInteger.ZERO;
for(int i=0;i<a.length;i++){
bn = bn.add(base[i].multiply(BigInteger.valueOf(a[i])));
} //每个i的21次方,乘以出现的次数 //千万别忘了将int类型的进行转换成BigInteger类型
String s = bn.toString();
if(s.length()!=21) return;//转换成字符串之后必须要有21位
int[] b = new int[10];
//数i出现的个数在等式两边必须相等,才能做到等于各个数的21次幂之和
for(int j=0;j<s.length();j++){
b[s.charAt(j)-'0']++;//s是21次方和之后的串,b[i]统计的是求21次方和之后的每个i的出现次数
//第j位的字符—‘0’转换成对应的int类型
}
for(int i=0;i<10;i++){
if(a[i] != b[i])
return;
}
System.out.println(bn);
}
//将sum个名额分配到10个数i中去
private static void f(int[] a,int i,int sum){
if(sum == 0){
test(a);
return;
}
if(i==a.length-1){
a[i]=sum;//当i等于9时,就把剩下的sum都分给a[9]吧
test(a);//当到了递归的最深层的时候,就是完全分配好的时候,进行加和检验,记住当不知道要循环多少层的时候最好用递归
return;
}
for(int j=0;j<sum;j++){
a[i] =j;
f(a,i+1,sum-j);
a[i] =0;
}
}
public static void main(String[] args){
for(int i=0;i<base.length;i++){
base[i] = calcu(i);
}
int[] a =new int[10];//0-9每个数字出现的个数
f(a,0,21);
}
}
21位水仙花数
最新推荐文章于 2021-11-03 04:45:00 发布