21位水仙花数

来源:互联网 发布:linux usleep 毫秒 编辑:程序博客网 时间:2024/06/05 22:31

发现很多算法题目都用到回溯。
很多人都已经提供了思路,之前在算其它数目的水仙花的时候总是出错,发现在dfs()里面每次忘记恢复数据,鼓捣很长时间。
21位大概运行在30秒左右。

import java.math.BigInteger;public class Daffodil {public static int time[];public static int num;public static void main(String[] args){time=new int[10];int num=21;BigInteger fac[]=new BigInteger[10];for(int i=0;i<fac.length;i++){fac[i]=power(BigInteger.valueOf(i),num);}long start=System.currentTimeMillis();dfs(fac,time,0,0,num);long end=System.currentTimeMillis();System.out.print("时间:");System.out.println(end-start);}public static BigInteger power(BigInteger m,int n){BigInteger p=BigInteger.ONE;for(int i=0;i<n;i++){p=p.multiply(m);}return p;}public static void sum(BigInteger fac[], int time[],int num){BigInteger sum=BigInteger.ZERO;for(int i=0;i<10;i++){sum=sum.add(fac[i].multiply(BigInteger.valueOf(time[i])));}String s=""+sum;if(s.length()!=num) return ;int nn2[]=new int[10];for(int i=0;i<num;i++){nn2[s.charAt(i)-'0']++;}for(int i=0;i<10;i++){if(time[i]!=nn2[i]) return;}System.out.println(s);}public static void dfs(BigInteger fac[],int time[],int m,int n,int num){if(n==num){sum(fac,time,num);}else{for(int i=0;i<=num-n;i++){if(m>9)return;time[m]=i;dfs(fac,time,m+1,n+i,num);time[m]=0;//重置}}}}


 

原创粉丝点击