您的位置:首页 > 其它

蓝桥杯 21位的水仙花数

2015-03-25 20:42 323 查看
水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3+ 3^3 = 153)

import java.math.BigInteger;
import java.util.Scanner;

public class Main{
public static int size;
public static int array[]={0,1,2,3,4,5,6,7,8,9};
//记录0-9的size次方
public static BigInteger powArray[]=new BigInteger[10];
//记录0-9的使用次数
public static int usedTimes[]=new int[10];
//i^N*j
public static BigInteger isPowSizeMultiply[][];
public static BigInteger MAX;//size位的数字能表示的最大值
public static BigInteger MIN;//size位的数字能表示的最小值

public static void init(){
//用于初始化powArray[],MAX,MIN
for(int i=0;i<10;i++){
//初始化powArray[]
powArray[i]=(new BigInteger(""+i)).pow(size);
}
MIN=(new BigInteger("10")).pow(size-1);//初始化最小值
MAX=(new BigInteger("10")).pow(size).add(new BigInteger("-1"));//初始化最大值

isPowSizeMultiply=new BigInteger[10][size+1];
for(int i=0;i<10;i++){
isPowSizeMultiply[i][0]=BigInteger.valueOf(0);
for(int j=1;j<size+1;j++){
isPowSizeMultiply[i][j]=isPowSizeMultiply[i][j-1].add(powArray[i]);
}
}
}

public static void exhaustion(int arrayIndex,int used,BigInteger current){
if(current.compareTo(MAX)>1){
//超过最大值,递归结束
return;
}

if(used==size){
//size位全部分配完毕
if(current.compareTo(MIN)<0){
//已获得的值小于最小值
return;
}
else{
String s=current+"";
int avaliableValueUsed[]=new int[10];
for(int i=0;i<s.length();i++){
avaliableValueUsed[s.charAt(i)-'0']++;
}
for(int i=0;i<10;i++){
if(usedTimes[i]!=avaliableValueUsed[i]){
return;
}
}
System.out.println(current);
return;
}
}
if(arrayIndex==0){
usedTimes[0]=size-used;
exhaustion(-1,size,current);
usedTimes[0]=0;
return;
}
if(current.add(isPowSizeMultiply[arrayIndex][size-used]).compareTo(MIN)<0){
return;
}

if(arrayIndex>=0){
for(int i=0;i<=size-used;i++){
if(current.add(isPowSizeMultiply[arrayIndex][i]).compareTo(MAX)>0){
return;
}
usedTimes[arrayIndex]=i;
exhaustion(arrayIndex-1,used+i,current.add(isPowSizeMultiply[arrayIndex][i]));
usedTimes[arrayIndex]=0;
}
}else{
return;//1-9已经分配完毕,不可再延伸
}
}

public static void main(String[] args){
long startTime=System.currentTimeMillis();//程序开始的时间
size=21;
init();
exhaustion(9,0,BigInteger.valueOf(0));
long endTime=System.currentTimeMillis();//程序结束的时间
System.out.println((endTime-startTime)/1000f+"秒");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: