`
universsky
  • 浏览: 92574 次
文章分类
社区版块
存档分类
最新评论

求解所有21位水仙花数------经典问题和算法分析

 
阅读更多

这里我主要是换个思路,穷举这个数中的每个位置上的数字的总数。从一开始,我们假设共有该数中存在9个9,我们将这个数的信息存到几个特定的数组中去:

Java代码

  1. privateint[]countArray=newint[10];//个数列表
  2. privateint[]countSumArray=newint[10];//个数总数
  3. privateBigInteger[]sumArray=newBigInteger[10];//值总数
  4. privateintoffset=0;//浮标

private int[] countArray = new int[10]; // 个数列表

private int[] countSumArray = new int[10]; // 个数总数

private BigInteger[] sumArray = new BigInteger[10];// 值总数

private int offset = 0;// 浮标

countArray记录依次从9到0每个数的个数,countSumArray是countArray中的各个数与其之前所有数的个数的总和(即countSumArray[n]=countSumArray[n-1]+countNum),sumArray是当前数的总值(即sumArray[n]=sumArray[n-1]+num)。offset是浮标,即当前判定的数的位置

我们对该个数进行判断,9个9后面还有12位数,那么9个9最小就是9个9的平方+12个0的平方,最大是9个9的平方+12个8的平方。我们从以下三个方面来判断:

1. 最小值不大于999999999999999999999

2. 最大值不小于100000000000000000000

3. 最大值与最小值从首部是否相同的部分,如777700000000000000000与777799999999999999999,存在7777相同的部分,如果该相同的部分中有某个数的个数大于offset中相同的值的个数,那么该值也判定为失败

还有一个很重要的判断就是,如果countSumArray中对应的offset中的值为21,那么即所有的位数都有值,那么直接判定如果该值=其各个位置上的数的21次方之和,如果不等返回失败,反之,这个数就是要求的数。

总体判断如上所述,如果失败我们即查询下一个数next(),countSumArray[offset]=21,那么就是查到头了,就返回查找back()。

用到了几个技巧,就是将BigInteger的运算结果直接存储到hashtable中去,可以节约大量运算时间。题中给予了4分钟的时间,以为很需要一段时间,就设置了多线程,后来发现,不使用多线程也只要花费2秒种,多线程的意义也就不复存在了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics