水仙花数的求解-算法优化
算法一
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);
}
}
}