水仙花数
2025-12-28 本文已影响0人
何以解君愁
所谓水仙花数,是指一个n位的正整数,其各位数字的n次方和等于该数本身。
例如153是水仙花数,153是一个3位数,并且153=13+53+33。
输入描述:
第一行输入一个整数n,表示一个n位的正整数。n在3到7之间,包含3和7。
第二行输入一个整数m,表示需要返回第m个水仙花数。
输出描述:
返回长度是n的第m个水仙花数。个数从0开始编号。
若m大于水仙花数的个数,返回最后一个水仙花数和m的乘积。
若输入不合法,返回-1。
先通过方法把3-7位的水仙花数计算出来
//实际计算
int n = scanner.nextInt();
int m = scanner.nextInt();
List<Integer> res1 = findNarcissisticNumbers(3);
for(int i = 0;i < res1.size();i++){
System.out.print(res1.get(i) + " ");
}
//辅助方法
public static List<Integer> findNarcissisticNumbers(int digits) {
List<Integer> narcissisticNumbers = new ArrayList<>();
if (digits < 1) {
return narcissisticNumbers;
}
//2位就是寻找10-100的水仙花数
long start = (long) Math.pow(10, digits - 1);
long end = (long) Math.pow(10, digits);
for (long num = start; num < end; num++) {
long total = 0;
long temp = num;
// 计算每一位的digits次幂之和
while (temp > 0) {
int digit = (int) (temp % 10);
total += Math.pow(digit, digits);
temp /= 10;
}
// 判断是否为水仙花数
if (total == num) {
narcissisticNumbers.add((int) num);
}
}
return narcissisticNumbers;
}
然后打表
import java.util.*;
public class Main {
public static void main(String[] args) {
// n位数的水仙花数打表
Map<Integer, List<Integer>> res = new HashMap<>();
res.put(3, Arrays.asList(153, 370, 371, 407));
res.put(4, Arrays.asList(1634, 8208, 9474));
res.put(5, Arrays.asList(54748, 92727, 93084));
res.put(6, Arrays.asList(548834));
res.put(7, Arrays.asList(1741725, 4210818, 9800817, 9926315));
Scanner scanner = new Scanner(System.in);
try {
// 输入n和m
int n = scanner.nextInt();
int m = scanner.nextInt();
// 如果m小于len(res[n]),输出编号为m的n位水仙花数
if (m < res.get(n).size()) {
System.out.println(res.get(n).get(m));
}
// 否则,输出最后一个n位水仙花数和m的乘积
else {
System.out.println(res.get(n).get(res.get(n).size() - 1) * m);
}
} catch (Exception e) {
// 捕捉异常,输出-1
System.out.println(-1);
}
}
}
完整版
import java.util.*;
public class Main{
public static void main(String[] args){
Map<Integer, List<Integer>> res = new HashMap<>();
res.put(3, Arrays.asList(153, 370, 371, 407));
res.put(4, Arrays.asList(1634, 8208, 9474));
res.put(5, Arrays.asList(54748, 92727, 93084));
res.put(6, Arrays.asList(548834));
res.put(7, Arrays.asList(1741725, 4210818, 9800817, 9926315));
Scanner sc = new Scanner(System.in);
try{
//位数
int n = sc.nextInt();
//第几个
int m = sc.nextInt();
if(n < 3||n > 7){
System.out.print("-1");
return;
}
if(m >= res.get(n).size()){
System.out.print(m * res.get(n).get(res.get(n).size() - 1));
}else{
System.out.print(res.get(n).get(m));
}
}catch(Exception e){
System.out.print("-1");
}
// List<Integer> res = check(3);
// for(int i = 0;i < res.size();i++){
// System.out.print(res.get(i) + " ");
// }
}
// public static List<Integer> check(int n){
// List<Integer> temp = new ArrayList<>();
// //2的话,在10与100之间
// long start = (long)Math.pow(10,n - 1);
// long end = (long)Math.pow(10,n);
// for(long i = start;i < end;i++){
// long num = i;
// long number = 0;
// while(num > 0){
// int a = (int)(num % 10);
// num /= 10;
// number += Math.pow(a,n);
// }
// if(i == number){
// temp.add((int)number);
// }
// }
// return temp;
// }
}