水仙花数

水仙花数的定义:

一个 N 位非负整数,其各位数字的 N 次方和等于该数本身

栗子:

153 = 13^3 + 53^3 + 33^3

370 = 3^3 + 7^3 + 0^3

371 = 3^3 + 7^3 + 1^3

1634 = 14^4 + 64^4 + 34^4 + 44^4。

更详细的推荐:维基百科

描述:

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

样例:

比如 n = 1, 所有水仙花数为:[0,1,2,3,4,5,6,7,8,9]

而对于 n = 2, 则没有 2 位的水仙花数,返回 []

题目分析:

弄懂水仙花数!


判断一个数是否为水仙花数:

要找出水仙花数,首先我们需要能识别一个数是否为水仙花数:

// 判断一个数是否为水仙花数
const isTrue = num => {
  const n = num.toString().length; // 数的长度
  const str = num.toString(); // 转字符 等下取数字
  let total = 0; // 总数
  for (let i = 0; i < n; i++) {
    total += Math.pow(str.charAt(i), n); // 转字符串一个字符一个字符拿出来 计算其各位数字的N次方和
  }
  if (num === total) {
    return true; // 最终相等 即为正确
  } else {
    return false;
  }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14

找出所有的n位十进制水仙花数

  • 确定查找的范围(找出n位的最大值与最小值)
  • 遍历每个数,判断为水仙花数,添加到数组中
const getNarcissisticNumbers = n => {
  let min = Math.pow(10, n - 1),
    max = Math.pow(10, n),
    arr = [];
  if (n === 1) { // n == 1的时候,min应该等于0,但是min等于1,所以这边手动判断一下。
    min = 0;
  }
  for (let j = min; j < max; j++) {
    const str = j.toString(); // 转字符
    let total = 0;
    for (let i = 0; i < n; i++) {
      // 判断一个数是否为水仙花数
      total += Math.pow(str.charAt(i), n); // 转字符串一个字符一个字符拿出来 计算其各位数字的N次方和
    }
    if (j === total) {
      arr.push(j);
    }
  }
  return arr;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

注意:

查找位数过大会出现性能问题,以及最大值溢出问题。

Last Updated: 9/18/2018, 12:53:51 AM