首页 / 算法 / 算法练习-求21位数的水仙花数
算法练习-求21位数的水仙花数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了算法练习-求21位数的水仙花数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1724字,纯文字阅读大概需要3分钟。
内容图文
问题描述:在三分钟内求出所有的21位水仙花数
直接上代码:
public
class 求21位数的水仙花数 {
/**
* @param args
*/publicstaticvoidmain(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[]=newint[10];//统计各个数字的出现次数
f(pw,nn,0,0);
System.out.println("OK");
long endTime=System.currentTimeMillis();//程序结束时间
System.out.println((endTime-startTime)/1000f);
}
privatestaticvoidf(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:当前位置数字个数已使用的次数
}
}
privatestaticvoidji_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=newint[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);
}
privatestatic BigInteger p(int i) {
BigInteger base=BigInteger.valueOf(i);
returnbase.pow(21);
}
}
原文:http://blog.csdn.net/amo_te_ama_me/article/details/50855722
内容总结
以上是互联网集市为您收集整理的算法练习-求21位数的水仙花数全部内容,希望文章能够帮你解决算法练习-求21位数的水仙花数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。