Java:找水仙花数。。计算超出2^63-1的数的方案

来源:互联网 发布:企业电话数据 编辑:程序博客网 时间:2024/05/12 08:17

水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3+ 3^3 = 153)(百度百科)

可以求到long型之内所有的整数,存在一个设想,是否能够求出任意位数的水仙花数(这种表达比较傻),换句话说就是,能不能有一种方案计算超出2^63-1的数。

package com.practice;import java.util.List;/** * Created by Administrator on 2016/12/21. */public class NarcissisticNumber {    public static void main(String [] args){        int bit = 1;//当前数的位数        try {            long tink = 100;            while(true) {                MyList myList = decimalDigit(tink+ "");                if(bit!=myList.size()){                    bit = myList.size();                    System.out.print("\n"+bit+"位数的水仙花数有:");                }                if(judge(myList,tink)) System.out.print(tink+"\t");                tink++;            }        }catch (Exception e){            System.out.println("已经超出能够计算的范围!");        }    }   /* public static List<Integer> splitNumber(int srcNumber){        List<Integer> result = new ArrayList<>();        *//*int power = 1;        while (true){            long divisor = (long)Math.pow(10,power);            long remainder = srcNumber%divisor;            long consult = srcNumber/divisor;            if(consult==0){                break;            }            result.add(remainder);            srcNumber = srcNumber/10;            power++;        }*//*        int x = srcNumber/100;//百威        int y = (srcNumber-x*100)/10;//十位        int z = srcNumber-x*100-y*10;//个位        result.add(x);        result.add(y);        result.add(z);        return result;    }*/
//判断当前数是否是水仙花数
    public static boolean judge(List<Integer> list,long srcNumber){       int length = list.size();        long value =0;        for(int i = 0;i<length;i++){            value += Math.pow(list.get(i),length);        }        if(value == srcNumber) return true;        return false;    }//把传入的数,转为String,然后用字符数组接收,通过ascii码,转为int,用List获得所有位置上的数及位数
//MyList extends ArrayList,重写了其中的toString();跟ArrayList没什么区别
   public static MyList<Integer> decimalDigit(String srcString){            MyList<Integer> result = new MyList();            char [] chars = srcString.toCharArray();            for(int i=0;i<chars.length;i++){                result.add((chars[i]-48));            }       return result;    }}
一个小时计算到十位数

3位数的水仙花数有:1533703714074位数的水仙花数有:1634820894745位数的水仙花数有:5474892727930846位数的水仙花数有:5488347位数的水仙花数有:17417254210818980081799263158位数的水仙花数有:2467805024678051885934779位数的水仙花数有:146511208472335975534494836912985153



0 0
原创粉丝点击