题目描述
所谓水仙花数,是指一个n位的正整数,其各位数字的n次方和等于该数本身。
例如153是水仙花数,153是一个3位数,并且153 = 1^3 + 5^3 + 3^3。
输入描述
第一行输入一个整数n,表示一个n位的正整数。n在3到7之间,包含3和7。
第二行输入一个正整数m,表示需要返回第m个水仙花数。
输出描述
返回长度是n的第m个水仙花数。个数从0开始编号。
若m大于水仙花数的个数,返回最后一个水仙花数和m的乘积。
若输入不合法,返回-1。
用例
| 输入 | 3 0 |
| 输出 | 153 |
| 说明 | 153是第一个水仙花数 |
| 输入 | 9 1 |
| 输出 | -1 |
| 说明 | 9超出范围 |
Java
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
System.out.println(getResult(n, m));
}
public static int getResult(int n, int m) {
if (n < 3 || n > 7) return -1;
HashMap<Integer, Integer> powN = new HashMap<>();
for (int i = 0; i <= 9; i++) powN.put(i, (int) Math.pow(i, n));
int min = (int) Math.pow(10, n - 1);
int max = (int) Math.pow(10, n);
int ans = -1;
int count = -1;
for (int i = min; i < max; i++) {
Integer sum =
Arrays.stream((i + "").split(""))
.map(e -> powN.get(Integer.parseInt(e)))
.reduce(Integer::sum)
.orElse(0);
if (sum == i) {
ans = i;
count++;
if (count == m) return ans;
}
}
return ans;
}
}
6521



被折叠的 条评论
为什么被折叠?



