Java水仙花数编程:算法实现与优化技巧
一、什么是水仙花数?
水仙花数(Narcissistic Number)又称自幂数,指一个n位数(n≥3),其各位数字的n次幂之和等于该数本身。在三位数范围内,水仙花数的定义为:各位数字的立方和等于该数本身。例如:
153 = 13 + 53 + 33
370 = 33 + 73 + 03
371 = 33 + 73 + 13
407 = 43 + 03 + 73
二、Java实现水仙花数的核心逻辑
1. 算法步骤
遍历范围:水仙花数为三位数,遍历100至999。
分解数字:将每个数分解为百位、十位、个位。
计算立方和:计算各位数字的立方和。
条件判断:若立方和等于原数,则输出。
2. 代码实现(基础版)
public class DaffodilNumber {
public static void main(String[] args) {
System.out.println(" 水仙花数有:");
for (int i = 100; i < 1000; i++) {
int hundreds = i / 100; // 百位 int tens = (i / 10) % 10; // 十位 int units = i % 10; // 个位 int sum = hundreds*hundreds*hundreds +
tens*tens*tens +
units*units*units;
if (sum == i) {
System.out.print(i + " ");
}
}
}
}
3. 优化技巧
减少重复计算:将
i/100
的结果直接赋值给百位,避免多次运算。
使用Math.pow?:通过
Math.pow( 数字, 3)
计算立方,代码更简洁。
提前终止循环:若立方和超过当前数,可提前跳出循环。
三、扩展应用与变式
1. 自定义范围查询
import java.util.Scanner;
public class CustomRange {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print(" 输入起始值m: ");
int m = scanner.nextInt;
System.out.print(" 输入终止值n: ");
int n = scanner.nextInt;
for (int i = m; i <= n; i++) {
if (isDaffodil(i)) {
System.out.print(i + " ");
}
}
}
private static boolean isDaffodil(int num) {
int hundreds = num / 100;
int tens = (num / 10) % 10;
int units = num % 10;
return num == (hundreds*hundreds*hundreds +
tens*tens*tens +
units*units*units);
}
}
```
### 2. 多位数自幂数(如四叶玫瑰数)
```java
public class ArmstrongNumber {
public static void main(String[] args) {
int n = 4; // 指定位数 int start = (int) Math.pow(10, n-1);
int end = (int) Math.pow(10, n) - 1;
for (int i = start; i <= end; i++) {
if (isArmstrong(i, n)) {
System.out.println(i);
}
}
}
private static boolean isArmstrong(int num, int digits) {
int sum = 0;
int temp = num;
while (temp > 0) {
int digit = temp % 10;
sum += Math.pow(digit, digits);
temp /= 10;
}
return sum == num;
}
}
```
## 四、常见问题与解决方案
### 1. 为什么结果包含非三位数?
- **检查遍历范围**:确保循环条件为`100 <= i < 1000`。
- **验证输入范围**:在自定义范围时,限制`m >= 100`且`n <= 999`。
### 2. 如何提高运行效率?
- **提前终止条件**:若立方和超过当前数,可跳出内层循环。
- **缓存计算结果**:将已计算的立方值存储,避免重复计算。
## 五、总结
Java实现水仙花数的核心在于**数字分解**与**立方和计算**,通过遍历和条件判断即可完成。本文提供了基础实现、自定义范围查询及多位数扩展的代码示例,帮助开发者快速掌握算法逻辑。如需进一步优化,可结合数学特性减少计算量,提升程序效率。
> 参考资料:、、、