【编程大题】
花朵数一个 N 位的十进制正整数,如果它的每个位上的数字的 N 次方的和等于这个数本身,则称其为花朵数。例如:当 N=3 时,153 就满足条件,因为 1^3 + 5^3 + 3^3 = 153,这样的数字也被称为水仙花数
(其中,“^”表示乘方,5^3 表示 5 的 3 次方,也就是立方)。
当 N=4 时,1634 满足条件,因为 1^4 + 6^4 + 3^4 + 4^4 = 1634。
当 N=5 时,92727 满足条件。实际上,对 N 的每个取值,可能有多个数字满足条件。
程序的任务是:求 N=21 时,所有满足条件的花朵数。
注意:这个整数有 21 位,它的各个位数字的 21 次方之和正好等于这个数本身。
如果满足条件的数字不只有一个,请从小到大输出所有符合条件的数字,每个数字占一行。
因为这个数字很大,请注意解法时间上的可行性。
要求程序在 1 分钟内运行完毕。【程序运行参考结果】
128468643043731391252
449177399146038697307
【解题思路】
方法一:一般看到题目想到的是从21位数中最小数循环到最大数,依次计算每个数的21次方,再相加判断。
瓶颈:
1.超过基本数据类型int和long型的范围,可以使用大数操作BigInteger(详情参考:https://blog.csdn.net/zhongkelee/article/details/52289163)
2.计算量太大,计算机无法处理。
方法二:因为需要用到0~9的21次方,所以提前计算出来,存储到数组,减少计算量。虽然是21位数,但是根据题目,各个数字之间是可以没有顺序的,所以把21个名额中0~9出现的次数计算出来,并求得21个名额的各个数的21次方和,最后判断和中出现0~9的次数与21个名额中0~9的次数是否一致,完全符合则满足题目要求。
package com.sise.test;
import java.math.BigInteger;
public class Test01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//0~9每个数字的21次方
BigInteger[] pw={p(0),p(1),p(2),p(3),p(4),p(5),p(6),p(7),p(8),p(9)};
//0~9每个数字在21位数中出现的次数
int[] nn=new int[10];
//算法核心:21个名额中:0~9每个数字出现的次数进行“大排列”
//第三个数:当前试验数字的次数;第四个数:当前名额占用了多少
f(pw,nn,0,0);
}
//求x的21次方
public static BigInteger p(int x) {
// TODO Auto-generated method stub
BigInteger base=BigInteger.ONE;
for(int i=0;i<21;i++){
base=base.multiply(BigInteger.valueOf(x));
}
return base;
}
public static void f(BigInteger[] pw, int[] nn, int cur, int use) {
// TODO Auto-generated method stub
//选到了最后一个数字
if(cur==9){
nn[9]=21-use;
Calculate(pw,nn);
return;
}
//对当前位置所有可能进行枚举
for(int i=0;i<=21-use;i++){
nn[cur]=i;
f(pw,nn,cur+1,use+i);
}
}
public static void Calculate(BigInteger[] pw, int[] nn) {
// TODO Auto-generated method stub
BigInteger sum=BigInteger.ZERO;
for(int i=0;i<10;i++){
sum=sum.add(pw[i].multiply(BigInteger.valueOf(nn[i])));
}
String s=""+sum;
if(s.length()!=21)return;
//确定和中各个数字出现多少次
int[] nn2=new int[10];
for(int i=0;i<21;i++){
nn2[s.charAt(i)-'0']++;
}
for(int i=0;i<10;i++){
if(nn[i]!=nn2[i]){
return;
}
}
//完全匹配!打印结果
System.out.println(s);
}
}
具体视频讲解http://v.youku.com/v_show/id_XNDQ0OTg2NjYw.html