29 水仙花数
题目描述
所谓水仙花数,是指一个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。
用例
输入 0 3
输出 153
说明 153是第一个水仙花数
输入 9 1
输出 -1
说明 9超出范围
package com.company;
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 long getResult(int n, int m) {
// 若输入不合法,返回-1
if (n < 3 || n > 7 || m < 0) return -1;
// 提前计算好0~9的N次方, 避免后续进行重复计算
HashMap<Character, Integer> powN = new HashMap<>();
for (int i = 0; i <= 9; i++) {
// 将整型0~9转化字符'0'~'9',即让i+'0'即可
powN.put((char) (i + '0'), (int) Math.pow(i, n));
}
// 最小的N位数
int min = (int) Math.pow(10, n - 1);
// 最大的N位数
int max = (int) Math.pow(10, n);
// 记录当前水仙花数
long ans = 0;
// 记录当前水仙花数是第几个
int idx = 0;
for (int num = min; num < max; num++) {
// 记录num各位数字的N次方之和
int sum = 0;
// 遍历num的每一位数字
String str = num + "";
for(int i=0; i<n; i++) {
sum += powN.get(str.charAt(i));
}
// 判断num是否为水仙花数
if (sum == num) {
ans = num;
// 如果num刚好是N位数的第m个水仙花数,则直接返回,否则继续查找
if (idx++ == m) return ans;
}
}
// 若m大于水仙花数的个数,返回最后一个水仙花数和m的乘积
return ans * m;
}
}