水仙花数的求解-算法优化

水仙花数的求解-算法优化

算法一

package narcissus;
//效率最高的算法之一
import java.math.BigInteger;
import java.util.Arrays;
//效率很慢,而且时间不能正常显示
public class RefSXS{
 static BigInteger[] table=new BigInteger[10];
 public static int N=3;
 static int[] num=new int[N];
 public static void main(String[] args){
  long time1=System.currentTimeMillis();
  generateTable();
  generateNumber();
  long time2=System.currentTimeMillis();
  String spend=String.valueOf(time2-time1);
  System.out.println("总共花费"+spend+"ms");
 }
 public static void generateTable(){
  for(int i=0;i<10;i++){
   table[i]=BigInteger.valueOf(i).pow(N);
  }
 }
 public static void generateNumber(){

  int[] num=new int[N];
  int i=0;
  while(true){
   if(i==N-1){
    isSXS(num);
   }else{
    i++;
    num[i]=num[i-1];
    continue;
   }
   //回溯到指定位置为止
   while(i>=0&&num[i]==9){
    i--;
   }
   if(i>=0){
    num[i]++;
   }else{
    break;
   }
  }
 }
 private static void isSXS(int[] num) {
  BigInteger y=BigInteger.valueOf(0);
  for(int a:num){
   y=y.add(table[a]);
  }
  int[] sum=new int[N];
  String xs=y.toString();
  if(xs.length()>num.length){
   return;
  }
  for(int i=0;i
   sum[i]=xs.charAt(i)-'0';
  }
  Arrays.sort(sum);

  if(Arrays.equals(num, sum)&&xs.length()==N){
   System.out.println(y);
  }
 }
}

算法二

package narcissus;
/*
 * 我自己写的模拟加法操作+组合数学0-9(需要去除10,20,30……90-
 * 11-19(需要去除21,31,41……91-
 * 22-29(需要去除32,42……92-
 * 33-39(需要去除43,53……93-……
 */
import java.math.BigInteger;
import java.util.Arrays;
//效率很慢,而且时间不能正常显示
public class MyOwnSXS2{
 static BigInteger[] table=new BigInteger[10];
 public static int N=21;
 static int[] num=new int[N];
 public static void main(String[] args){
  long time1=System.currentTimeMillis();
  generateTable();
  generateNumber();
  long time2=System.currentTimeMillis();
  String spend=String.valueOf(time2-time1);
  System.out.println("总共花费"+spend+"ms");
 }
 public static void generateTable(){
  for(int i=0;i<10;i++){
   table[i]=BigInteger.valueOf(i).pow(N);
  }
 }
 public static void generateNumber(){

  int[] num=new int[N];
  int i=0;
  while(true){
   i=N-1;
   isSXS(num);
   num[i]++;
   while(i>=0&&num[i]>9){
    i--;
    if(i<0) break;
    num[i]++;
    num[i+1]=0;
   }
   if(i<0) break;
   while(i
    num[i+1]=num[i];
    i++;
   }
  }
 }
 private static void isSXS(int[] num) {
  BigInteger y=BigInteger.valueOf(0);
  for(int a:num){
   y=y.add(table[a]);
  }
  int[] sum=new int[N];
  String xs=y.toString();
  if(xs.length()>num.length){
   return;
  }
  for(int i=0;i
   sum[i]=xs.charAt(i)-'0';
  }
  Arrays.sort(sum);

  if(Arrays.equals(num, sum)&&xs.length()==N){
   System.out.println(y);
  }
 }
}

算法三

package narcissus;
//我自己写的模拟加法操作算法:只是减少了for循环,用while实现多重循环
//针对所有的数的验证
import java.math.BigInteger;
import java.util.Arrays;
//效率很慢,而且时间不能正常显示
public class MyOwnSXS1{
 static BigInteger[] table=new BigInteger[10];
 public static int N=9;
 static int[] num=new int[N];
 public static void main(String[] args){
  long time1=System.currentTimeMillis();
  generateTable();
  generateNumber();
  long time2=System.currentTimeMillis();
  String spend=String.valueOf(time2-time1);
  System.out.println("总共花费"+spend+"ms");
 }
 public static void generateTable(){
  for(int i=0;i<10;i++){
   table[i]=BigInteger.valueOf(i).pow(N);
  }
 }
 public static void generateNumber(){

  int[] num=new int[N];
  int i=0;
  while(true){
   i=N-1;
   isSXS(num);
   num[i]++;
   while(i>=0&&num[i]>9){
    i--;
    if(i<0) break;
    num[i]++;
    num[i+1]=0;
   }
   if(i<0) break;
  }
 }
 private static void isSXS(int[] num) {
  BigInteger y=BigInteger.valueOf(0);
  for(int a:num){
   y=y.add(table[a]);
  }
  int[] sum=new int[N];
  String xs=y.toString();
  if(xs.length()>num.length){
   return;
  }
  for(int i=0;i
   sum[i]=xs.charAt(i)-'0';
  }
  Arrays.sort(sum);

  if(Arrays.equals(num, sum)&&xs.length()==N){
   System.out.println(y);
  }
 }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值