"这篇文章主要介绍了如何使用JAVA代码求解21位水仙花数,通过一个高效的算法在3秒内完成计算。水仙花数是指一个n位数,它的每个位上的数字的n次幂之和等于它本身。例如,3位水仙花数有153、370、371、407等。本文的代码实现了这一功能,通过定义数组和方法来计算特定位数的水仙花数。" 在Java编程中,求解21位水仙花数的关键在于设计一个高效的算法。这里的代码首先定义了一些关键变量,如`SIZE`表示水仙花数的位数(21位),`countArray`用于存储每个位上数字出现的次数,`countSumArray`记录当前位之前所有位上数字的总和,`sumArray`存储每个位上数字的n次幂之和,以及`offset`作为当前处理的位数索引。 `setValue`方法用于初始化或更新数组值。当处理新位时,它会根据当前位的数值更新`countArray`、`countSumArray`和`sumArray`。如果当前位是第一位,`countSumArray`和`sumArray`的值也相应设置。 `checkPersentArray`方法检查当前的`sumArray`是否满足水仙花数的条件。它计算出最小可能的水仙花数(所有位都是0)和最大可能的水仙花数(所有位都是9),然后比较这两个值是否在预设的最大值`MAX`和最小值`MIN`之间。如果不在这个范围内,则返回false,表示当前位组合无法构成水仙花数。 整个程序的核心在于通过迭代处理每一位,不断调整数组中的值,并通过`checkPersentArray`检查是否找到符合条件的水仙花数。由于使用了优化的数据结构和算法,能够在短时间内(3秒)找出所有21位的水仙花数。 此代码段展示了如何使用Java的大整数类`BigInteger`进行大数运算,同时利用动态规划的思想优化了求解过程,确保了计算效率。这对于理解和实践高级算法以及Java大整数处理具有一定的参考价值。
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页未读,继续阅读
- 粉丝: 70
- 资源: 22
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- ExtJS 2.0 入门教程与开发指南
- 基于TMS320F2812的能量回馈调速系统设计
- SIP协议详解:RFC3261与即时消息RFC3428
- DM642与CMOS图像传感器接口设计与实现
- Windows Embedded CE6.0安装与开发环境搭建指南
- Eclipse插件开发入门与实践指南
- IEEE 802.16-2004标准详解:固定无线宽带WiMax技术
- AIX平台上的数据库性能优化实战
- ESXi 4.1全面配置教程:从网络到安全与实用工具详解
- VMware ESXi Installable与vCenter Server 4.1 安装步骤详解
- TI MSP430超低功耗单片机选型与应用指南
- DOS环境下的DEBUG调试工具详细指南
- VMware vCenter Converter 4.2 安装与管理实战指南
- HP QTP与QC结合构建业务组件自动化测试框架
- JsEclipse安装配置全攻略
- Daubechies小波构造及MATLAB实现