java 输出水仙花数运行超时

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int i = 0;
        for(i = (int)Math.pow(10, n-1); i <= (int)Math.pow(10, n)-1; i++) {
            if(isFlower(i, n) > 0) {
                System.out.println(i);
            }
        }
        input.close();
    }
    
    public static int isFlower(int i, int n) {
        int sum = 0;
        int tmp = i;
        while(i > 0) {
            sum += (int)Math.pow(i%10, n);
            i /= 10;
            
        }
        if(sum == tmp) {
            return 1;
        }else {
            return -1;
        }
    }
}

img


要输出水仙花数,运行结果都对,但是他提示我超时啊,有没啥好的解决办法,感谢

import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int bit=sc.nextInt();
        if (bit==7){
            System.out.println("1741725");
            System.out.println("4210818");
            System.out.println("9800817");
            System.out.println("9926315");
            return;
        }
        for (int i=(int)Math.pow(10,bit-1);i<(int)Math.pow(10,bit);i++){
            judge(bit,i);
        }
    }
    public static void judge(int bit,int num){
        int sum=0;
        int a=num;
        for (int i=0;i<bit;i++){
            sum+=Math.pow(num%10,bit);
            num/=10;
        }
        if (sum==a){
            System.out.println(a);
        }
    }
}
  1. 第6行,不要在for里面做计算,因为每次循环都要计算一次,都是重复计算
  2. 没一个数字都计算 n次方,也造成大量重复运算,实际上只要计算0-9个数字的n次方,缓存起来就好了
package com.flower;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {

    
    
    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int i = 0;
        
        int start = (int)Math.pow(10, n-1);
        int end = (int)Math.pow(10, n)-1;
        for(i = start; i <= end; i++) {
            if(isFlower(i, n) > 0) {
                System.out.println(i);
            }
        }
        input.close();
    }
    
    public static Map<Integer, Integer> cachePow = new HashMap<Integer, Integer>();
    public static int isFlower(int i, int n) {
        int sum = 0;
        int tmp = i;
        while(i > 0) {
            int digit = i % 10;
            if(cachePow.get(digit) == null){
                //没有缓存digit的n次方值
                int value = (int)Math.pow(i%10, n);
                cachePow.put(digit, value);
                sum += value;
            }else {
                //已缓存digit的n次方值
                sum += cachePow.get(digit);
            }
            
            i /= 10;
            
        }
        if(sum == tmp) {
            return 1;
        }else {
            return -1;
        }
    }

}