首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 算法練習:水仙花數(阿姆斯特朗數)查找與判斷

     編輯:Java 綜合教學

什麼是水仙花數?

水仙花數(Narcissistic Number),又稱阿姆斯特朗數或自戀數。指一個 n 位數,其各位數字的 n 次方之和等於該數本身。最經典的是三位數水仙花數:各位數字立方和等於原數。

例如:153 = 1³ + 5³ + 3³ = 1 + 125 + 27 = 153

三位數水仙花數完整查找(100-999)

public class NarcissisticNumberFinder {
    public static void main(String[] args) {
        System.out.println("三位數水仙花數有:");
        for (int num = 100; num <= 999; num++) {
            int hundred = num / 100;        // 百位
            int ten = (num % 100) / 10;     // 十位
            int unit = num % 10;            // 個位
            
            // 整數運算避免浮點誤差,效率高於 Math.pow()
            if (hundred*hundred*hundred + ten*ten*ten + unit*unit*unit == num) {
                System.out.println(num + " = " + hundred + "³ + " + ten + "³ + " + unit + "³");
            }
        }
    }
}

運行結果

三位數水仙花數有:
153 = 1³ + 5³ + 3³
370 = 3³ + 7³ + 0³
371 = 3³ + 7³ + 1³
407 = 4³ + 0³ + 7³

通用版:判斷任意輸入整數是否為水仙花數

import java.util.Scanner;

public class NarcissisticNumberChecker {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("請輸入一個正整數:");
        int num = sc.nextInt();
        
        if (isNarcissistic(num)) {
            System.out.println(num + " 是水仙花數!");
        } else {
            System.out.println(num + " 不是水仙花數。");
        }
    }
    
    /** 通用判斷邏輯:支持任意位數 */
    public static boolean isNarcissistic(int num) {
        if (num < 0) return false;
        
        String numStr = String.valueOf(num);
        int n = numStr.length(); // 位數
        int sum = 0;
        int temp = num;
        
        while (temp > 0) {
            int digit = temp % 10;
            sum += Math.pow(digit, n); // 通用 n 次方
            temp /= 10;
        }
        return sum == num;
    }
}

算法優化與擴展

1. 預計算優化(避免重複次方運算)

// 預計算 0-9 的 n 次方存入數組
int[] powers = new int[10];
for (int i = 0; i < 10; i++) powers[i] = (int) Math.pow(i, n);
// 循環中直接查表:sum += powers[digit];

2. n 位數水仙花數查找(n=3 到 7)

public static void findAllNarcissistic(int maxDigits) {
    for (int n = 3; n <= maxDigits; n++) {
        int start = (int) Math.pow(10, n-1);
        int end = (int) Math.pow(10, n) - 1;
        
        // 預計算 0-9 的 n 次方
        int[] pow = new int[10];
        for (int i = 0; i < 10; i++) pow[i] = (int) Math.pow(i, n);
        
        for (int num = start; num <= end; num++) {
            int sum = 0, temp = num;
            while (temp > 0) {
                sum += pow[temp % 10];
                temp /= 10;
            }
            if (sum == num) System.out.println(num + " (位數:" + n + ")");
        }
    }
}

已知水仙花數列表(OEIS A005188)

位數水仙花數
10-9 (所有個位數)
3153, 370, 371, 407
41634, 8208, 9474
554748, 92727, 93084
6548834
71741725, 4210818, 9800817, 9926315

數學延伸

  • 定理:n 位水仙花數最大值為 n × 9ⁿ。當 n ≥ 60 時,n × 9ⁿ < 10ⁿ⁻¹,故水仙花數有限個(共 88 個)
  • 廣義水仙花數:允許不同位數使用不同冪次,或負數、小數擴展
  • 應用場景:主要用於算法教學、面試考察位運算、循環邏輯、數學建模能力

常見面試陷阱

  1. 負數處理:水仙花數定義為自然數,負數直接返回 false
  2. 浮點精度:Math.pow() 返回 double,大數時可能精度丟失,建議整數乘法或預計算數組
  3. 0 的處理:0 是 1 位水仙花數(0¹=0),但通常題目指「三位數」
  4. 效率陷阱:暴力遍歷 10⁷ 以上範圍會超時,需數學剪枝或預計算

核心代碼模板:提取位數 → 累加次方和 → 比較。掌握「取位技巧:%10 取末位,/10 去末位」與「預計算優化」即可應對所有變體。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved