算法練習-求21位數的水仙花數


問題描述:在三分鍾內求出所有的21位水仙花數
直接上代碼:

public class 求21位數的水仙花數 {
/**
* @param args
*/

public static void main(String[] args) {
long startTime=System.currentTimeMillis();//程序開始時間
BigInteger pw[]=new BigInteger[10];
for(int i=0;i<pw.length;i++){
pw[i]=p(i);//每個下標存0~9的21次方
}
int nn[]=new int[10];//統計各個數字的出現次數
f(pw,nn,0,0);
System.out.println("OK");
long endTime=System.currentTimeMillis();//程序結束時間
System.out.println((endTime-startTime)/1000f);
}

private static void f(BigInteger[] pw, int[] nn, int cur, int use) {
if(cur==9){
nn[9]=21-use;//將當前位置的數字的次數減去使用次數
ji_suan(pw,nn);//判斷是不是水仙花數,是的話輸出
return;
}
//當前位置所有可能枚舉
for(int i=0;i<21-use;i++){
/*從第一個位置開始遍歷,21-use減少遍歷次數,減去已用過的位置如:
第一次大遍歷,i=0,use=0時
第一次cur==9時,nn表中數據為:0,0,0,0,0,0,0,0,0,21
每次遞歸除了第一個0不變,其他位遞歸,且相加為21,
第二次大遍歷,i=1,use=0時
第一次cur==9時,nn表中數據為:1,0,0,0,0,0,0,0,0,20
每次遞歸除了第一個1不變,其他位遞歸,且相加為20,21-use(use此時為1)
21-use就是這個意思
*
*/

nn[cur]=i;//0~9出現的次數
f(pw, nn, cur+1, use+i);//pw:每個數字的21次方,nn:每個數字出現的次數,cur:當前數字,use:當前位置數字個數已使用的次數
}
}

private static void ji_suan(BigInteger[] pw, int[] nn) {
BigInteger sum=BigInteger.ZERO;
for(int i=0;i<10;i++){
sum=sum.add(pw[i].multiply(BigInteger.valueOf(nn[i])));
}
String string=""+sum;
if(string.length()!=21)
return;
//確定各數字出現多少次
int[] nn2=new int[10];
for(int i=0;i<21;i++){
nn2[string.charAt(i)-'0']++;
}
for(int i=0;i<10;i++){
if(nn[i]!=nn2[i])
return;
}
System.out.println(string);
}

private static BigInteger p(int i) {
BigInteger base=BigInteger.valueOf(i);
return base.pow(21);
}

}

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



求21位數的水仙花數 21位水仙花數 21位水仙花數 21位水仙花數 求n位水仙花數 算法練習-水仙花數 還是關於求水仙花數的優化算法 21位大數的水仙花數 21位水仙花數(花朵數 ) 21位大數的水仙花數
 
粤ICP备14056181号  © 2014-2020 ITdaan.com