sum=sum.add(p(sumStr.charAt(i)-'0'));
}
returnpareTo(totalSum[index])==0;
}
returntrue;
}
privatevoidsetValue(intnum){
array[index]=num;
if(index==0){
sumArray[index]=num;
totalSum[index]=p(9-index).multiply(n(num));
//System.out.println("n(num)totalSum[index]="+totalSum[index]+"index="+index);
//try{Thread.sleep(1000);}catch(InterruptedExceptionex){}//暂停6秒
}else{
sumArray[index]=sumArray[index-1]+num;
totalSum[index]=totalSum[index-1].add(p(9-index).multiply(n(num)));
//System.out.println("elsetotalSum[index]="+totalSum[index]);
//try{Thread.sleep(1000);}catch(InterruptedExceptionex){}//暂停6秒
}
}
privatebooleanback(){
if(array[index]==0){
while(array[index]==0){
if(index>0){
index--;
}else{
returntrue;
}
}
}
if(index>0){
setValue(array[index]-1);
returnfalse;
}else{
//System.out.println("elsefalse="+false);
//try{Thread.sleep(1000);}catch(InterruptedExceptionex){}//暂停3秒
returntrue;
}
}
privateBigIntegersolve(intstartValue){
index=0;
setValue(startValue);
while(true){
if(checkPersentArray()){
if(sumArray[index]==size){//如果数组之和针对全数组,满足条件,返回一个解
returntotalSum[index];
}
if(index!
=9){
index++;
setValue(size-sumArray[index-1]);
continue;
}
}
if(back()){
break;
}
}
returnnull;
}
}
程序2:
(用时9828毫秒)穷举法
importjava.lang.System;
importjava.util.*;
importjava.io.*;
importjava.lang.Math;
publicclassaa18{
staticinta[]={0,1,2097152,353203,6511104,8203125,377856,3284007,4775808,2359209};
staticintb[]={0,0,0,1046,439804,7683715,3695064,4586408,7203685,8913151};
staticintc[]={0,0,0,0,0,4,219,5585,92233,1094189};
staticintd[]={0,0,0};
staticintg[]=newint[10];
//staticinti=0,j=0,k=0,sum=0;
staticintx=0,y=0,z=0;
staticintx1=0,y1=0,z1=0;
publicstaticvoidmain(String[]args){
longxxx=System.currentTimeMillis();//记录开始进入时的时间
//以下i0表示0的个数,最多20个0,i1表示1的个数,最多21个1等
for(inti0=0;i0<=20;i0++){
for(inti1=0;i1<=21;i1++){if(i0+i1>21)continue;
for(inti2=0;i2<=21;i2++){if(i0+i1+i2>21)continue;
for(inti3=0;i3<=21;i3++){if(i0+i1+i2+i3>21)continue;
//如果数字的个数超过21或不到20个,退出本循环continue
for(inti4=0;i4<=21;i4++){if(i0+i1+i2+i3+i4>21)continue;
for(inti5=0;i5<=21;i5++){if(i0+i1+i2+i3+i4+i5>21)continue;
for(inti6=0;i6<=21;i6++){if(i0+i1+i2+i3+i4+i5+i6>21)continue;
for(inti7=0;i7<=21;i7++){if(i0+i1+i2+i3+i4+i5+i6+i7>21)continue;
for(inti8=0;i8<=21;i8++){if(i0+i1+i2+i3+i4+i5+i6+i7+i8>21)continue;
for(inti9=0;i9<=20;i9++){if(i0+i1+i2+i3+i4+i5+i6+i7+i8+i9!
=21)continue;
//以下求每个数字的21次方之和
//System.out.println(i0+""+i1+""+i2+""+i3+""+i4+""+i5+""+i6+""+i7+""+i8+""+i9);
d[0]=a[1]*i1+a[2]*i2+a[3]*i3+a[4]*i4+a[5]*i5+a[6]*i6+a[7]*i7+a[8]*i8+a[9]*i9;//低7位之和
//System.out.println("d[0]="+d[0]);
d[1]=d[0]/10000000;//向中7位的进位
d[0]=d[0]%10000000;
d[1]=d[1]+b[3]*i3+b[4]*i4+b[5]*i5+b[6]*i6+b[7]*i7+b[8]*i8+b[9]*i9;//中7位之和
//System.out.println("d[1]="+d[1]);
d[2]=d[1]/10000000;//向高7位的进位
d[1]=d[1]%10000000;
d[2]=d[2]+c[5]*i5+c[6]*i6+c[7]*i7+c[8]*i8+c[9]*i9;//高位之和
x1=d[0];
y1=d[1];
z1=d[2];
//System.out.println("d[2]="+d[2]);
if(d[2]/10000000>0)break;//如果高位多于7位,该数超过21位,不符要求,退出
for(intj=0;j<10;j++)g[j]=0;//准备计数字的个数
//System.out.println(d[2]+""+d[1]+""+d[0]);
for(intk1=0;k1<3;k1++){
for(intk=6;k>=0;k--){
y=1;
for(intk0=1;k0<=k;k0++)y=y*10;
x=d[k1]/y;//取高位的一个数字
//System.out.print("d[k1]="+d[k1]+"y="+y+"x="+x);
d[k1]=d[k1]%y;//取高位的一个数字后余数
//System.out.println("d[k1]="+d[k1]);
g[x]=g[x]+1;//计数字x出现的次数
//System.out.println(x+"g["+x+"]="+g[x]);
}}
//System.out.println(g[0]+""+g[1]+""+g[2]+""+g[3]+""+g[4]+""+g[5]+""+g[6]+""+g[7]+""+g[8]+""+g[9]);
//System.out.println(i0+""+i1+""+i2+""+i3+""+i4+""+i5+""+i6+""+i7+""+i8+""+i9);
if((g[0]==i0)&&(i0<10)&&(g[1]==i1)&&(g[2]==i2)&&(g[3]==i3)&&(g[4]==i4)&&(g[5]==i5)&&(g[6]==i6)&&(g[7]==i7)&&(g[8]==i8)&&(g[9]==i9))
System.out.println("解:
"+z1+""+y1+""+x1);
}
}
}
}
}
}
}
}
}
}
xxx=System.currentTimeMillis()-xxx;//记录退出时的时间
System.out.println("用时:
"+xxx+"毫秒");//显示程序运行时间
}
}
程序3:
本程序运行时间9秒,启动多个线程计算。
importjava.math.BigInteger;
importjava.util.Hashtable;
p