黑马程序员技术交流社区
标题:
如何得到所有的“水仙花数”?
[打印本页]
作者:
joeywr
时间:
2015-8-24 00:15
标题:
如何得到所有的“水仙花数”?
代码是有了
但是由于效率的原因,没有办法迅速执行完
高手帮忙优化一下吧
import java.math.*;
import java.util.*;
public class NarcissisticNumber {
public static void main(final String[] args) {
System.out.println("水仙花数列表");
for (BigInteger bigInteger = new BigInteger("0");
!bigInteger.equals(new BigInteger("115132219018763992565095597973971522402"));
bigInteger = bigInteger.add(new BigInteger("1"))) {
if (isNarcissisticNumber(bigInteger)) {
System.out.println(getDateTime() + "\t" + bigInteger);
}
}
}
/**
* 判断一个数是否为水仙花数:一个N位整数,其各位数字的N次方的和等于该数本身
*
* @param number
* @return 当输入的参数为水仙花数时返回true,否则返回false
*/
public static boolean isNarcissisticNumber(final BigInteger number) {
BigInteger sumOfDigitPower = new BigInteger("0"); // 各位数字的N次方的和
char[] digitArray = number.toString().toCharArray(); // 各位数字的数组
for (char digit : digitArray) {
sumOfDigitPower = sumOfDigitPower.add( // 求和
BigInteger.valueOf(
Character.digit(digit, 10) // 各位数字
).pow(digitArray.length) // N次方
);
}
return sumOfDigitPower.equals(number);
}
/**
* @return 返回包含当前日期和时间的字符串
*/
public static String getDateTime() {
Calendar calendar = Calendar.getInstance();
return ""
+ calendar.get(Calendar.YEAR) + "/"
+ (calendar.get(Calendar.MONTH) + 1) + "/"
+ calendar.get(Calendar.DATE) + " "
+ calendar.get(Calendar.HOUR_OF_DAY) + ":"
+ calendar.get(Calendar.MINUTE) + ":"
+ calendar.get(Calendar.SECOND) + ":"
+ calendar.get(Calendar.MILLISECOND);
}
}
得到146511208,后面的数就出不来了
作者:
T-l-H、小生
时间:
2015-8-24 06:37
打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
你那个115开头一大串数字是个什么东东?面试笔试碰到过这题目,你打印个水仙花还要返回日期?
作者:
kevin986745zk
时间:
2015-8-24 11:59
理解的不错,学习了!
作者:
joeywr
时间:
2015-8-24 18:34
T-l-H、小生 发表于 2015-8-24 06:37
打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个" ...
………………
《水仙花数的计算机解法》作者林宣治。摘要:证明了在位数大于60的正整数中不存在水仙花数,讨论了通过计算机编程计算所有水仙花数的算法,并证实最大水仙花数为39位自然数115132219018763992565095597973971522401
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2