一、题目描述
所谓水仙花数,是指一个n位的正整数,其各位数字的n次方和等于该数本身。
例如153是水仙花数,153是一个3位数,并且153 = 1^3 + 5^3 + 3^3。
二、输入描述
第一行输入一个整数n,表示一个n位的正整数。n在3到7之间,包含3和7。
第二行输入一个正整数m,表示需要返回第m个水仙花数。形如HH:SS字符串,表示原始输入。
三、输出描述
返回长度是n的第m个水仙花数。个数从0开始编号。
若m大于水仙花数的个数,返回最后一个水仙花数和m的乘积。
若输入不合法,返回-1。
四、解题思路
- 读取输入的n和m;
- 检查n的范围是否在3到7之间,如果不在范围内,输出-1并结束程序;
- 根据n的值计算出范围内的最小值和最大值,最小值为10的(n-1)次方,最大值为10的n次方减1;
- 初始化一个HashMap用于存储水仙花数,键为水仙花数的序号,值为水仙花数本身;
- 初始化计数器count为0,用于记录水仙花数的个数;
- 初始化变量lastNum为0,用于记录最后一个水仙花数;
- 遍历从最小值到最大值的范围,对每个数进行如下操作:
- 调用check方法检查该数是否为水仙花数,如果是,则将其添加到HashMap中,键为count,值为当前数,然后将count加1。
- 如果当前数大于lastNum,则更新lastNum的值为当前数。
- 根据HashMap判断第m个水仙花数是否存在,如果存在,则输出对应的值;如果不存在,则输出lastNum乘以m的值;
五、Java算法源码
public static void main(String[] args) {
calculate();
}
private static void calculate() {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if (n >= 3 && n <= 7) {
int m = sc.nextInt();
int temp = 1;
for (int i = 0; i < n; i++) {
temp *= 10;
}
int min = temp / 10;
int max = temp - 1;
Map<Integer, Integer> data = new HashMap<>();
int count = 0;
int lastNum = 0;
for (int i = min; i <= max; i++) {
if (check(i, n)) {
data.put(count++, i);
if (i > lastNum) {
lastNum = i;
}
}
}
if (data.containsKey(m)) {
System.out.println(data.get(m));
} else {
System.out.println(lastNum * m);
}
} else {
System.out.println(-1);
}
}
private static boolean check(int a, int n) {
boolean flag = false;
String[] numStrs = String.valueOf(a).split("");
int[] data = new int[numStrs.length];
for (int i = 0; i < numStrs.length; i++) {
data[i] = Integer.parseUnsignedInt(numStrs[i]);
}
int sum = 0;
for (int i = 0; i < n; i++) {
sum += calcute(data[i], n);
}
if (sum == a) {
flag = true;
}
return flag;
}
private static int calcute(int a, int b) {
int result = 1;
for (int i = 0; i < b; i++) {
result *= a;
}
return result;
}
六、效果展示
🏆下一篇:华为OD机试真题 Java 实现【基站维修工程师】【2023Q1 200分】,附详细解题思路
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。