花朵数:花朵数是指一个数的各个位数的该数的位数次方相加等于该数本身
例:153=1^3+5^3+3^3
程序的任务是:求N=21时,所有满足条件的花朵数。注意:这个整数有21位,它的各个位数字的21次方之和正好等于这个数本身。
代码如下:
public class Main{
private static BigInteger base[] = new BigInteger[10];
public static BigInteger calcu_21(int n) {
BigInteger a = BigInteger.ONE;
for(int i=0; i<21; i++) a= a.multiply(BigInteger.valueOf(n));
return a;
}
public static void test(int[] a) {
BigInteger b = BigInteger.ZERO;
for(int i=0; i<10; i++) {
b = b.add(base[i].multiply(BigInteger.valueOf(a[i])));
}
String b1 = b.toString();
if (b1.length()!=21) return;
int[] b2 = new int[10];
for(int i=0; i<b1.length(); i++) {
b2[b1.charAt(i)-'0']++;
}
for(int i=0; i<b2.length; i++) {
if (a[i] != b2[i]) return;
}
System.out.println(b1);
}
public static void f(int[] a, int k, int sum) {
if (k==a.length-1) {
a[k] = sum;
test(a);
return ;
}
for(int i=0; i<sum; i++) {
a[k] = i;
f(a, k+1, sum-i);
a[k] = 0;
}
}
public static void main(String[] args) {
for (int i=0; i<10; i++) base[i] = calcu_21(i);
int[] a = new int[10];
f(a, 0, 21);
}
}
这个题的思路是这样的:暴力的去枚举是不行的,因为数量级太大了。因此想到的是:
可以先计算出0~9的21次方分别是什么,放到数组base中。再建立一个a数组,存放的是
在要求的21位数中,0~9分别出现了多少次。这里是使用递归(f函数)来遍历a数组的所有取值的。
当达到了21个数的时候,利用test方法计算这个21位数是否符合要求。b2数组和a数组一样,不过它是求已经得到的21位数中各个数字出现的次数,然后与a数组进行比较,相等说明这个数字符合要求。

本文介绍了一种高效算法,用于寻找21位花朵数,即一个21位的整数,其各个位数字的21次方之和恰好等于该数本身。通过递归方法遍历可能的数字组合,并验证每个组合是否符合条件。
1002

被折叠的 条评论
为什么被折叠?



