数学

水仙花数

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;
//     }
}
上一篇 下一篇

猜你喜欢

热点阅读