Java水仙花数编程:算法实现与优化技巧

一、什么是水仙花数?

水仙花数(Narcissistic Number)又称自幂数,指一个n位数(n≥3),其各位数字的n次幂之和等于该数本身。在三位数范围内,水仙花数的定义为:各位数字的立方和等于该数本身。例如:

153 = 13 + 53 + 33

Java水仙花数编程:算法实现与优化技巧

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)

计算立方,代码更简洁。

提前终止循环:若立方和超过当前数,可提前跳出循环。

Java水仙花数编程:算法实现与优化技巧

三、扩展应用与变式

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);

Java水仙花数编程:算法实现与优化技巧

        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实现水仙花数的核心在于**数字分解**与**立方和计算**,通过遍历和条件判断即可完成。本文提供了基础实现、自定义范围查询及多位数扩展的代码示例,帮助开发者快速掌握算法逻辑。如需进一步优化,可结合数学特性减少计算量,提升程序效率。

> 参考资料:、、、 


《Java水仙花数编程:算法实现与优化技巧》.doc
将本文下载保存,方便收藏和打印
下载文档