题目描述
设 n位正整数 k 的第 i (1<=i<=n) 位数为:ki; 如果满足 k = k1^n + k2^n +...+ kn^n(ki^n为数学表示,即表示ki的n次方), 则称 k为 n叶水仙花数。
输入一个正整数 m (1 =< m <= 9),从小到大输出所有的1叶水仙花数, 2叶水仙花数, ....., m叶水仙花数。
输入
正整数m
输出
输出所有的1叶水仙花数, 2叶水仙花数, ....., m叶水仙花数,如果1 =< m <=9;否则输出“error input”
样例输入
4
样例输出
1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474
提示
关于时间与空间的思考:判断水仙花,需要频繁计算数符的k次方,用到时再计算,重复计算次数太多,耗时太多。可考虑空间换时间策略,即在判断N页水仙花数之前,可计算出二维数组 power[10][N]存储数符的k次方,power[i][j] 表示 数符i 的 j次方,计算好数组后,直接引用即可。
枚举法(暴力搜索)
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
int m = reader.nextInt();
if(m>=1 && m<=9) {
//从一位数开始取
for(int n=1; n<=m; n++) {
//设取值范围最小为left
int left = (int)Math.pow(10, n-1);
//设取值范围最大为right
int right = (int)Math.pow(10, n);
//在left到right的范围内循环,逐个判断是否为水仙花数
for(;left<right;left++) {
if(left == fuc(left,n)) {
System.out.println(left);
}
}
}
}
else {
System.out.print("error input");
}
}
//判断该数字是否为水仙花数
public static int fuc(int left,int n) {
int sum = 0;
while(left!=0) {
int x=1;
//求每位数字的n次方
for(int i = 0; i<n; i++) {
x*=left%10;
}
sum+=x;
left/=10;
}
return sum;
}
}