LintCode刷题:147 · 水仙花数

描述:

  水仙花数的定义是,这个数等于他每一位数上的幂次之和 见百度百科的定义

  比如一个3位的十进制整数153就是一个水仙花数。因为 153 = 1^3 + 5^3 + 3^3。

  而一个4位的十进制数1634也是一个水仙花数,因为 1634 = 1^4 + 6^4 + 3^4 + 4^4。

  给出n,找到所有的n位十进制水仙花数。

  ps:你可以认为n小于8。

样例:

  输入:1

  输出:[0,1,2,3,4,5,6,7,8,9]

思路:

  1.得到出0-9的n次幂数组;输入:1

  2.获取n位数最大值和最小值,遍历;

  3.求各位数的n次幂的和;

  4.判断是否水仙花数。

代码:

import java.util.LinkedList;
import java.util.List;

/**
 * @author Fahaxiki
 * @date 2021-05-25
 */
public class Solution {
    /**
     * @param n: 位数
     * @return 所有n位数的水仙花数
     */
    public List<Integer> getNarcissisticNumbers(int n) {
        // 所有n位数的水仙花数
        List<Integer> narcissisticNumbers = new LinkedList<>();
        // n最小为1
        if (n < 1) {
            return narcissisticNumbers;
        }
        // 获取0-9的n次幂数组
        int[] powerArr = new int[10];
        for (int i = 0; i < powerArr.length; i++) {
            // i^n
            powerArr[i] = (int) Math.pow(i, n);
        }
        // n位数最大值
        int max = (int) Math.pow(10, n);
        // n位数最小值(n为1时,最小值为0)
        int min = max / 10 - 1;
        // 遍历n位数
        for (int i = min; i < max; i++) {
            // 当前目标数
            int target = i;
            // 目标数每一位数的n次幂的和
            int sum = 0;
            // 从个位开始,取得该位的n次幂的值,并求和
            while (target > 0) {
                // 获取个位的n次幂
                sum += powerArr[target % 10];
                // 升位
                target /=  10;
            }
            // 若目标数等于它每一位数上的幂次之和,则为水仙花数
            if (sum == i) {
                narcissisticNumbers.add(i);
            }
        }
        return narcissisticNumbers;
    }
}

posted on 2021-05-25 17:12  法哈席基  阅读(165)  评论(0)    收藏  举报