题目描述
所谓水仙花数,是指一个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) {// 若输入不合法,返回-1if (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;}
}