# 水仙花数

# 水仙花数的定义:

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

栗子:

153 = 1^3 + 5^3 + 3^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
21

注意:

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

# 点个Star支持我一下~