循环实现
类Shui:
package 水仙花数;
import java.util.Date;
import java.util.Scanner;
public class Shui {
public static void main(String[] args) {
System.out.println("输入位数:");
Scanner in = new Scanner(System.in);
int input= in.nextInt();
int begin =(int) Math.pow(10, input-1),end=(int) Math.pow(10, input)-1;
Date date1 = new Date();
for(int i=begin;i<=end;i++) {
new Shui();
if (i== Shui.total(i, input)) {
System.out.println(i);
}
}
Date date2 = new Date();
System.out.println("消耗时间:"+(date2.getTime()-date1.getTime())/1000+"秒");
in.close();
}
public static int total (int value,int m) {
int reset = 0;
for (int j = 0; j < m; j++) {
int temp = (int) ((int) (value/(Math.pow(10, m-j-1)))%10);
reset = (int) (reset + Math.pow(temp, m));
}
// i%1000
// i%100
// i%10
// i%1
return reset;
}
}
递归实现
类Devide:
package 水仙花数;
public class Devide {
//用以返回一个数,切开的m次方,相加的值
public int devide(int value,int m) {
//取出当前的个位数
// i%10
int gewei = value%10;
//取出当前的个位数前的数
// i/10
int other = value/10;
if (other==0) {
return (int) Math.pow(gewei, m);
}else {
return (int) ((Math.pow(gewei, m))+devide(other, m));
}
}
}
类hua
package 水仙花数;
import java.util.Date;
import java.util.Scanner;
public class hua {
public static void main(String[] args) {
System.out.println("输入位数:");
Scanner in = new Scanner(System.in);
int input= in.nextInt();
int begin =(int) Math.pow(10, input-1),end=(int) Math.pow(10, input)-1;
Date date1 = new Date();
for(int i=begin;i<=end;i++) {
int te =new Devide().devide(i, input);
if(i== te) {
System.out.println("_________"+i+"________");
System.out.println("=======================");
}
}
Date date2 = new Date();
System.out.println("消耗时间:"+(date2.getTime()-date1.getTime())/1000+"秒");
in.close();
}
}
两者耗时对比
循环:
递归:
改进
感谢小老头叔叔,提供的思路
类hua:
package 水仙花数;
import java.util.Date;
import java.util.Scanner;
public class hua {
public static void main(String[] args) {
System.out.println("输入位数:");
Scanner in = new Scanner(System.in);
int input= in.nextInt();
// int input =8;
int begin =(int) Math.pow(10, input-1),end=(int) Math.pow(10, input)-1;
Devide devide_mathod = new Devide();
int [] ontTOTen_pre = new int[10] ;
for (int i = 0; i < 10; i++) {
ontTOTen_pre[i] = (int) Math.pow(i,input);
}
devide_mathod.setOneToTen(ontTOTen_pre);
Date date1 = new Date();
for(int i=begin;i<=end;i++) {
// System.out.println("=======================");
// System.out.println("_________"+i+"________");
int te =devide_mathod.devide(i, input);
// System.out.println("=======================");
// System.out.println("____________"+i+"________________"+te);
if(i== te) {
System.out.println("_________"+i+"________");
System.out.println("=======================");
}
}
Date date2 = new Date();
System.out.println("消耗时间:"+(date2.getTime()-date1.getTime())+"毫秒");
in.close();
}
}
类Devide:
package 水仙花数;
public class Devide {
private int[] oneToTen ;
//用以返回一个数,切开的m次方,相加的值
public int devide(int value,int m) {
//取出当前的个位数
// i%10
int gewei = value%10;
//取出当前的个位数前的数
// i/10
int other = value/10;
// System.out.println(gewei);
if (other==0) {
return oneToTen[gewei];
}else {
return oneToTen[gewei]+devide(other, m);
}
}
public void setOneToTen(int[] oneToTen) {
this.oneToTen = oneToTen;
}
}