题目描述
设 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”
~~~感谢课代表,我是废物。
import java.util.*;
/**
*注意:Math.pow函数比较耗费时间。例如:Math.pow(3,4) = 3*3*3*3 连续计算4次
* 使用二维数组来收集从1到9的n次幂数会节省很多时间
*/
public class Main{
public static void main(String args[]) {
Scanner reader=new Scanner(System.in);
int n,k,i,sum,num=0;
n=reader.nextInt();//水仙花数的花瓣数
int b[][]=new int[11][n+2];//二维数组保存从1到9的n及n到1 次幂,例如:
b[3][2]=9(3**2)
if(n>=1&&n<=9)
{
//开始收集从1到9的n次幂数
for(int x=1;x<=10;x++)//从1到9(十进制数)
for(int y=0;y<=n+1;y++)//幂
{
b[x][y]=(int)Math.pow(x,y);
}
//查找并输出水仙花数
for (k=1;k<=n;k++)
{
for(i=b[10][k-1];i<b[10][k];i++)//因为是十进制数所以最大就是n个9,最小就是
n-1个9例如:三阶:99<n<999
{
num=i;//不能直接使用i会造成循环的错乱
sum=0;//使用一次立即清零
while(num!=0)
{
sum=sum+b[num%10][k];
num=num/10;//循环提取i的个十百千位上的数
}
if(sum==i)System.out.println(i);//输出水仙花数
}
}
}
else System.out.println("error input");
}
}