算法描述

水仙花数是一个n(>=3)位数字的数,它等于每个数字的n次幂之和 列如153分别是1 5 3 这几个数的立方之和

算法实现

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
/**
* 计算从100到endNum范围内的水仙花数
*/
public int[] narcissisticNumber(int endNum) {

return IntStream.range(100, endNum).parallel()
//判断n是否为水仙花数
.filter(n -> isNarcissistic(n))
//得到结 果作为数值返回
.toArray();
}

/**
* 判断一个整数是否是水仙花数
*/
private boolean isNarcissistic(int n) {
//切割整数
String[] array = String.valueOf(n).split("");
int sum = Arrays.stream(array)
//n次方
.mapToInt(i -> nPower(Integer.valueOf(i), array.length))
//求和
.sum();
return sum == n;
}

/**
* 计算n次方
*/
public int nPower(int i, int n) {
int sum = 1;
while (n > 0) {
sum *= i;
n--;
}
return sum;
}

测试

1
2
3
4
5
6
7
8
/**
* 计算1_0000_0000以内的水仙花数
*/
@Test
public void test() {
int[] ints = narcissisticNumber(1_0000_0000);
Arrays.stream(ints).forEach(System.out::println);
}

输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
153
370
371
407
1634
8208
9474
54748
92727
93084
548834
1741725
4210818
9800817
9926315
24678050
24678051
88593477