N=21时,所有满足条件的花朵数。注意:这个整数有21位,它的各个位数字的21次方之和正好等于这个数本身。也就是21的水仙花数。希望解释下算法。枚举的方法有点没有理解,请高手详细解释下。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
/**
import java.math.BigInteger;
public class Sxh {
//初始化0~9的21次方
static BigInteger []arr = new BigInteger[10];
//判断21位数0~9出现次数是否和分配的次数一致
public static boolean check(String str,int []jl)
{
int ar[] = {0,0,0,0,0,0,0,0,0,0};
for(int i=0;i<21;i++)
ar[str.charAt(i)-'0']++;
for(int i=0;i<10;i++)
{
if(ar[i]!=jl[i])
return false;
}
return true;
}
//times-->纪录当前分配数字 sy--剩余分配数 sum--当前总和 jl--纪录0~9每个数字分别占几次
public static void bl(int times,int sy,BigInteger sum,int []jl){
//若分配到数字9
if(times==9)
{
sum = sum.add(arr[9].multiply(new BigInteger(String.valueOf(sy))));
String str = sum.toString();
//若当前和不为21位return
if(str.length()!=21)
return;
jl[9] = sy;
//若21位数0~9出现次数是否和分配的次数不一致,return
if(!check(str,jl))
return;
//否则成立,输出结果
System.out.println(str);
return;
}
for(int i=0;i<=sy;i++)
{
jl[times]=i;
BigInteger j = arr[times].multiply(new BigInteger(String.valueOf(i)));
bl(times+1,sy-i,sum.add(j),jl);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//初始化0~9的21次方
for(int i=0;i<10;i++)
arr[i] = new BigInteger(String.valueOf(i)).pow(21);
//初始化纪录0~9每次出现次数的数组
int []jl = {0,0,0,0,0,0,0,0,0,0};
bl(0,21,BigInteger.ZERO,jl);
}
}