Java实现21位水仙花数算法
"21位水仙花数的算法" 21位水仙花数,也称为三维水仙花数,是指一个3的次幂的数,其各位数字的立方和等于该数本身。例如,153是一个水仙花数,因为1^3 + 5^3 + 3^3 = 153。在这个问题中,我们讨论的是一种算法,用于寻找所有21位的水仙花数。 在给定的代码中,作者使用了Java编程语言来实现这个算法。以下是对代码关键部分的详细解释: 1. 引入了两个Java库:`java.math.BigInteger` 和 `java.util.Hashtable`。`BigInteger` 类用于处理大整数,因为21位的数可能超过普通整型变量的范围;`Hashtable` 是一个键值对的数据结构,用于存储和查找数据。 2. 定义了一些静态常量和数组: - `SIZE` 被设置为21,表示我们要寻找的水仙花数的位数。 - `countArray` 用于存储每个位置上数字出现的次数。 - `countSumArray` 记录每个位置上数字的累加和。 - `sumArray` 存储每个位置上的数字立方和的累加结果。 - `offset` 是当前处理的位数的索引。 3. `setValue` 方法用于初始化各个数组。当`offset`为0时,直接将`num`赋值给`countArray[offset]`,同时计算该位置上的数字立方和并存储到`countSumArray[offset]`和`sumArray[offset]`。如果`offset`不为0,则基于前一个位置的值更新累加和。 4. `checkPersentArray` 方法检查当前数组是否符合水仙花数的条件。首先,找到当前位数的最小可能值(`minVal`)和最大可能值(`maxVal`)。然后,比较这些值与预定义的最小值(`MIN`)和最大值(`MAX`),确保它们在有效范围内。如果不在,返回`false`,表示当前数组不是水仙花数。 5. 其他未显示的部分可能包含了主逻辑,如遍历所有可能的21位数,调用`setValue`更新数组,并使用`checkPersentArray`检查是否为水仙花数,最后打印或存储满足条件的结果。 这个算法的核心在于,通过动态维护每个位置的数字计数、累计和立方和,逐步检查每一步是否符合水仙花数的条件。由于21位数的范围非常大,使用`BigInteger`可以避免整数溢出的问题。通过这种方法,可以有效地找出所有21位的水仙花数。
2.import java.util.Hashtable;
3.
4.public class Main {
5.
6. private static final int SIZE = 21;
7. private int[] countArray = new int[10]; // 个数列表
8. private int[] countSumArray = new int[10]; // 个数总数
9. private BigInteger[] sumArray = new BigInteger[10];// 值总数
10. private int offset = 0;// 浮标
11.
12. /**
13. * 设置当前浮标对应的个数,个数的总数,值总数
14. *
15. * @param num
16. * 个数
17. */
18. private void setValue(int num) {
19. countArray[offset] = num;
20. if (offset == 0) {
21. countSumArray[offset] = num;
22. sumArray[offset] = p(9 - offset).multiply(n(num));
23. } else {
24. countSumArray[offset] = countSumArray[offset - 1] + num;
25. sumArray[offset] = sumArray[offset - 1].add(p(9 - offset).multiply(n(num)));
26. }
27. }
28.
29. /**
30. * 检验当前数据是否匹配
32. * @return
33. */
34. private boolean checkPersentArray() {
35. BigInteger minVal = sumArray[offset];// 当前已存在值
36. BigInteger maxVal = sumArray[offset].add(p(9 - offset).multiply(n(SIZE - countSumArray[offset])));// 当前已存在值+可能存在的最大值
37. // 最小值匹配
38. if (minVal.compareTo(MAX) > 0) {
39. return false;
40. }
41. // 最大值匹配
42. if (maxVal.compareTo(MIN) < 0) {
43. return false;
44. }
45. String minStr = minVal.compareTo(MIN) > 0 ? minVal.toString() : MIN.toString();
46. String maxStr = maxVal.compareTo(MAX) < 0 ? maxVal.toString() : MAX.toString();
47. // 找到最小值与最大值间首部相同的部分
48. int[] sameCountArray = new int[10];
49. for (int i = 0; i < SIZE; i++) {
50. char c;
51. if ((c = minStr.charAt(i)) == maxStr.charAt(i)) {
52. sameCountArray[c - '0'] = sameCountArray[c - '0'] + 1;
53. } else {
54. break;
55. }
56. }
57. // 判断如果相同部分有数据大于现在已记录的位数,返回false
58. for (int i = 0; i <= offset; i++) {
59. if (countArray[i] < sameCountArray[9 - i]) {
60. return false;
剩余6页未读,继续阅读
- 粉丝: 4791
- 资源: 60
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦