《一种21位水仙花数算法思路》由会员分享,可在线阅读,更多相关《一种21位水仙花数算法思路(2页珍藏版)》请在金锄头文库上搜索。
1、这里我主要是换个思路,穷举这个数中的每个位置上的数字的总数。从一开始,我们假设共有该数中存在 9 个 9,我们将这个数的信息存到几个特定的数组中去:Java 代码 1. private int countArray = new int10; / 个数列表 2. private int countSumArray = new int10; / 个数总数 3. private BigInteger sumArray = new BigInteger10;/ 值总数 4. private int offset = 0;/ 浮标 countArray 记录依次从 9 到 0 每个数的个数,countS
2、umArray 是 countArray 中的各个数与其之前所有数的个数的总和(即 countSumArrayn=countSumArrayn-1+countNum),sumArray 是当前数的总值(即 sumArrayn=sumArrayn-1+num)。offset 是浮标,即当前判定的数的位置 我们对该个数进行判断,9 个 9 后面还有 12 位数,那么 9 个 9 最小就是 9 个 9 的平方+12 个 0 的平方,最大是 9 个 9 的平方+12 个 8 的平方。我们从以下三个方面来判断:1. 最小值不大于 9999999999999999999992. 最大值不小于 100000
3、0000000000000003. 最大值与最小值从首部是否相同的部分,如 777700000000000000000 与777799999999999999999,存在 7777 相同的部分,如果该相同的部分中有某个数的个数大于 offset 中相同的值的个数,那么该值也判定为失败还有一个很重要的判断就是,如果 countSumArray 中对应的 offset 中的值为 21,那么即所有的位数都有值,那么直接判定如果该值=其各个位置上的数的 21 次方之和,如果不等返回失败,反之,这个数就是要求的数。 总体判断如上所述,如果失败我们即查询下一个数 next(),countSumArrayoffset=21,那么就是查到头了,就返回查找 back()。用到了几个技巧,就是将 BigInteger 的运算结果直接存储到 hashtable 中去,可以节约大量运算时间。题中给予了 4 分钟的时间,以为很需要一段时间,就设置了多线程,后来发现,不使用多线程也只要花费 2 秒种,多线程的意义也就不复存在了。