您的位置:首页 > 其它

水仙花数优化问题:穷举法、查找表法、组合数学法

2013-10-10 14:12 183 查看
package yxj.Test;

import java.math.BigDecimal;

import java.math.BigInteger;

import java.util.Arrays;

public class ShuiXianHua {

static long searchTable[]=new long [10];

static String s=null;

/**

* @param args

*/

public static void main(String[] args) {

int length_=8;

long biStart_ = 10000000;

long biEnd_ = 99999999;

//穷举法

//Jisuan1(biStart_,biEnd_,length_);

//查找表法

initSearchTable(length_);

Jisuan2(biStart_,biEnd_,length_);

//组合数学

//int [] tint={1,6,3,4};

//isSXHS(tint);

smartRetrospectiveSearch(length_);

}

public static void smartRetrospectiveSearch(int n)

{

//组合数学

long start=System.currentTimeMillis();

System.out.println("组合数学:");

int [] num= new int
;

int i=0;

while(true)

{

if(i==n-1)

{

isSXHS(num);

}

else

{

i++;

num[i]=num[i-1];

continue;

}

while(i>=0&&num[i]==9)

{

i--;

}

if(i>=0)

{

num[i]++;

}

else

{

break;

}

}

long end=System.currentTimeMillis();

System.out.println("Time:"+(end-start)+"ms");

}

public static void isSXHS(int[] num)

{

BigInteger bit=BigInteger.valueOf(0);

for(int a:num)

{

bit=bit.add(BigInteger.valueOf(searchTable[a]));

}

int[] tnum=new int [num.length];

s=bit.toString();

if(s.length()>num.length)

{

return;

}

for(int i=0;i<s.length();i++)

{

tnum[i]=s.charAt(i)-'0';

}

Arrays.sort(tnum);

if(Arrays.equals(num, tnum)&&s.length()==num.length)

{

System.out.println(bit);

}

}

public static void Jisuan1(long biStart_,long biEnd_,int length_)

{

System.out.println("穷举法:");

long start=System.currentTimeMillis();

long biStart = biStart_;

long biEnd = biEnd_;

int length=length_;

outer:for(long bi=biStart;bi<=biEnd;bi++)

{

int biTest=0;

s=bi+"";

for(int i=0;i<length;i++)

{

biTest=biTest+(int)Math.pow((s.charAt(i)-'0'), length);

if(biTest>bi)

{

continue outer;

}

}

if(bi==biTest)

{

System.out.println(bi);

}

}

long end=System.currentTimeMillis();

System.out.println("Time:"+(end-start)+"ms");

}

public static void initSearchTable(int length)

{

for(int i=0;i<10;i++)

{

searchTable[i]=(long)Math.pow(i, length);

}

}

public static void Jisuan2(long biStart_,long biEnd_,int length_)

{

System.out.println("查找表法:");

long start=System.currentTimeMillis();

long biStart = biStart_;

long biEnd = biEnd_;

int length=length_;

outer:for(long bi=biStart;bi<=biEnd;bi++)

{

long biTest=0;

s=bi+"";

for(int i=0;i<length;i++)

{

biTest=biTest+searchTable[s.charAt(i)-'0'];

if(biTest>bi)

{

continue outer;

}

}

if(bi==biTest)

{

System.out.println(bi);

}

}

long end=System.currentTimeMillis();

System.out.println("Time:"+(end-start)+"ms");

}

}

结果:

查找表法:

24678050

24678051

88593477

Time:41078ms

组合数学:

24678050

24678051

88593477

Time:62ms
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: