水仙花数是指一个 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位数的水仙花数有:153 370 371 407
4位数的水仙花数有:1634 8208 9474
5位数的水仙花数有:54748 92727 93084
6位数的水仙花数有:548834
7位数的水仙花数有:1741725 4210818 9800817 9926315
8位数的水仙花数有:24678050 24678051 88593477
9位数的水仙花数有:146511208 472335975 534494836 912985153