21位水仙花数(Java BigInteger与回溯)

package JiaNan;
import java.math.BigInteger;
public class ShuiXianHua
{
	public static int a[] = new int[10];   //在一共21个数字中,记录0~9每个数字出现的次数
	public static BigInteger pw[] = new BigInteger[10];  
	/*
	* 计算并且存储0~9的21次方
	*/
	public static void Init(BigInteger pw[])
	{
		for(int i =0;i <= 9;i++)
		{
			pw[i] = BigInteger.ONE;
			for(int j = 1;j <= 21;j++)
			{
				pw[i] = pw[i].multiply(BigInteger.valueOf(i));
			}
		}
	}
	
	/*
	* 判断数字出现的次数,如果满足水仙花条件的话,就输出出来
	*/
	public static void check(int a[])
	{
		BigInteger sum = BigInteger.ZERO;
		for(int i = 0;i <= 9;i++)
		{
			sum = sum.add(pw[i].multiply(BigInteger.valueOf(a[i])));
		}
		String s = ""+sum;   //通过加上"",便可以直接把BigInteger数据转化为String类型数据
		if(s.length() != 21)   //如果不是21位数据,就直接返回
			return;
		int aa[] = new int[10];
		for(int i = 0;i < 21;i++)
		{
			aa[s.charAt(i)-'0']++;
		}
		for(int i = 0;i <= 9;i++)
		{
			if(aa[i] != a[i])
				return;
		}
		System.out.println(s);
	}
	
	/*
	* 回溯法求出21数字中0~9每个数字出现的次数,并存储在a数组中
	*/
	public static void dfs(int start,int n)
	{
		if(n < 0)
			return;
		if(start == 9)
		{
			a[9] = n;
			check(a);
			return;
		}
		
		for(int i = 0;i <= 21;i++)
		{
			a[start] = i;
			dfs(start+1,n-i);   //递归回溯
		}
	}
	public static void main(String args[])
	{
		long start = System.nanoTime();
		Init(pw);
		dfs(0,21);
		long end = System.nanoTime();
		System.out.println("运行时间:"+(end-start)/Math.pow(10, 9)+"s"); 
	}
} 

/*
128468643043731391252
449177399146038697307
运行时间:47.151981112s
*/


  


 

你可能感兴趣的:(21位水仙花数(Java BigInteger与回溯))