算法 - 找到N位的所有十进制水仙花数

# 找到N位的所有十进制水仙花数 easy

解题思路:

  • 根据水仙花数规则, 可以先实现判断是否是水仙花数:
    • 三位数: 153 = 1**3 + 5**3 + 3**3
    • 四位数: 1634 = 1**4 + 6**4 + 3**4 + 4**4
  • 再设定循环的范围区间:
    • 三位数: [100, 999]
    • 四位数: [1000, 9999]
点击查看代码

















 

 
























/**
 * 找到所有n位十进制的水仙花数
 * @param {number} n 几位数
 * @returns {number[]}
 * 
 * 153 = 1**3 + 5**3 + 3**3
 * 1634 = 1**4 + 6**4 + 3**4 + 4**4
 * 
 * 示例:
 * findAllNarcissistic(3)
 * output: [153, 370, 371, 407]
 * findAllNarcissistic(4)
 * output: [1634, 8208, 9474]
 */
const findAllNarcissistic = (n) => {
  const narcissistics = []
  // 初始值就取几位数的开始 4位数 => 1000
  const start = 10 ** (n - 1)
  // 初始值就取几位数的结束 4位数 => 9999
  const end = 10 ** n - 1
  for (let i = start; i <= end; i++) {
    if (isNarcissistic(i)) {
      narcissistics.push(i)
    }
  }
  return narcissistics
}

// 判断是不是水仙花数
function isNarcissistic(n) {
  const str = String(n)
  return [...str].reduce((prev, curr) =>
    prev += ((+curr) ** str.length)
  , 0) === n
}

console.log(isNarcissistic(152))  // false
console.log(isNarcissistic(153))  // true
console.log(isNarcissistic(370))  // true
console.log(isNarcissistic(371))  // true
console.log(isNarcissistic(1634)) // true
console.log(findAllNarcissistic(3))  // [153, 370, 371, 407]
console.log(findAllNarcissistic(4))  // [1634, 8208, 9474]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43