# 水仙花数
# 水仙花数的定义:
一个 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
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
注意:
查找位数过大会出现性能问题,以及最大值溢出问题。