黑马程序员技术交流社区

标题: 如何得到所有的“水仙花数”? [打印本页]

作者: joeywr    时间: 2015-8-24 00:17
标题: 如何得到所有的“水仙花数”?
代码是有了
但是由于效率的原因,没有办法迅速执行完

高手帮忙优化一下吧
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,后面的数就出不来了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2