java使用查表法+组合数学 求水仙花数

来源:互联网 发布:linux cpu wait sys 编辑:程序博客网 时间:2024/05/22 06:06
import java.math.BigInteger;import java.util.Arrays;import java.util.Date;import java.util.HashMap;/** * java使用查表法+组合数学 求水仙花数 * @author 542335496@qq.com *水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3 + 3^3 = 153) */public class FlowerNumber {    private HashMap<String, Long> libHashMap=new HashMap<String, Long>();        private Date startTime;        public void store2(int n){    for(int i=0;i<10;i++){    libHashMap.put(i+"", (long) Math.pow(i, n));}    }public void store(int n){for(int i=0;i<10;i++){//求i的n次方 值为countlong count=1;for(int j=1;j<=n;j++){count=count*i;}libHashMap.put(i+"", count);}}//组合数学方法  概率public void find2(int n){int[] num=new int[n];int i=0;while(true){if(i==(n-1)){isSXHS(num);}else{i++;num[i]=num[i-1];continue ;}while(i>=0 && num[i]==9){i--;//回溯}if(i>=0){num[i]++;}else{break;}}}private void isSXHS(int[] num) {//必须得用大整数啊 如28116440335967BigInteger bigInteger=BigInteger.valueOf(0);for (int a : num) {bigInteger=bigInteger.add(BigInteger.valueOf(libHashMap.get(String.valueOf(a))));int [] tnum=new int[num.length];String s=String.valueOf(bigInteger);if(s.length()>num.length){return ;}for(int i=0;i<s.length();i++){tnum[i]=s.charAt(i)-'0';}Arrays.sort(tnum);if(Arrays.equals(num, tnum) && s.length()==num.length){System.out.println(bigInteger);}}}public void find(int n){int minNumber=1;int maxNumber=9;for(int i=1;i<n;i++){minNumber=minNumber*10;maxNumber=maxNumber*10+9;}outer:for(int i=minNumber;i<=maxNumber;i++){String iString=String.valueOf(i);long total=0;//1643=1+1296+256+81=1^4+6^4+4^4+3^4for(int p=0;p<n;p++){  String key=String.valueOf(iString.charAt(p));  total=total+libHashMap.get(key);  if(total>i){  continue outer;  }}if(total==i){long cha=new Date().getTime()-startTime.getTime();System.out.println("I hava find one:======>>"+i+"  耗时:"+cha+"mm");}}}//输入位数 npublic void findFlower(int n){System.out.println("使用查表法+组合数学");//水仙花数位n>=3以上for(int i=3;i<=n;i++){//i次方this.store2(i);this.find2(i);}System.out.println("使用查表法");startTime=new Date();for(int i=3;i<=n;i++){this.store(i);this.find(i);}}public static void main(String[] args) { FlowerNumber flowerNumber=new FlowerNumber();flowerNumber.findFlower(7);}}

0 0
原创粉丝点击