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
- java使用查表法+组合数学 求水仙花数
- 求组合数(数学)
- 用java求水仙花数
- java语言:求水仙花数
- java实例-求水仙花数
- 求水仙花数简单算法java
- java小算法—求水仙花数
- java求1000以内的水仙花数
- 求水仙花数
- 求水仙花数
- 求水仙花数
- 求水仙花数
- 求水仙花数
- 求所有水仙花数
- 求水仙花数
- 求水仙花数
- 求水仙花数
- 求水仙花数
- 第十一周项目1(3)调用函数输出字母
- C# 文件操作,遍历文件夹、读文件、写入、修改、复制
- box-sizing 的相关解释
- http://blog.csdn.net/enuola/article/details/8099461
- 账号登陆加密流程
- java使用查表法+组合数学 求水仙花数
- IOS界面UI设计2之屏幕适配AutoLayout、size classes(一)
- Map/Reduce原理
- 第十一周项目一(二):输出ABCDEFG
- JS的 验证组织机构的合法性
- C#中利用SMTP邮件服务器发送邮件
- VirtualBox中的快捷键
- shell学习
- myeclipse中disable maven nature如何恢复