水仙花數的求解-算法優化

水仙花數的求解-算法優化

算法一

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);
  }
 }
}

 

發佈了52 篇原創文章 · 獲贊 40 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章