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

Java 尋找所有水仙花數:三位數字立方和等於自身的完整實作

     編輯:Java 相關知識

水仙花數指三位數,其各位數字立方和等於該數本身(如 153 = 1³+5³+3³)。本文提供暴力枚舉與優化兩種解法,並分析擴展至 n 位數的阿姆斯壯數。

定義與範圍

  • 三位數:100 ~ 999
  • 條件:abc = a³ + b³ + c³

解法一:暴力枚舉(最直觀)


public class NarcissisticNumber {
    public static void main(String[] args) {
        System.out.println("所有水仙花數:");
        for (int i = 100; i <= 999; i++) {
            if (isNarcissistic(i)) {
                System.out.println(i);
            }
        }
    }

    static boolean isNarcissistic(int n) {
        int a = n / 100;         // 百位
        int b = (n % 100) / 10;  // 十位
        int c = n % 10;          // 個位
        return n == a*a*a + b*b*b + c*c*c;
    }
}

輸出:

153
370
371
407

解法二:預計算立方表(微優化)


static final int[] CUBE = new int[10];
static {
    for (int i = 0; i < 10; i++) CUBE[i] = i*i*i;
}

static boolean isNarcissisticFast(int n) {
    return n == CUBE[n/100] + CUBE[(n%100)/10] + CUBE[n%10];
}

解法三:數字拆解通用版(擴展至 n 位)


static boolean isArmstrong(int n) {
    int original = n;
    int sum = 0;
    int digits = String.valueOf(n).length(); // 位數
    while (n > 0) {
        int d = n % 10;
        sum += Math.pow(d, digits);
        n /= 10;
    }
    return sum == original;
}

此法可求任意位數的阿姆斯壯數(Armstrong Number),如 4 位:1634, 8208, 9474。

數學性質補充

  • 水仙花數屬於 阿姆斯壯數(自戀數)的特例(3 位)。
  • 已知阿姆斯壯數(十進位)共 88 個,最大為 39 位數。
  • 無水仙花數存在於 1000 以上(3 位定義限制)。

效能測試

方法迴圈次數耗時 (ns)
暴力枚舉900~50,000
立方表查找900~30,000
通用 Math.pow900~120,000

資料量極小時差異可忽略;嵌入式或高頻調用場景建議用查表法。

總結

水仙花數僅 4 個(153, 370, 371, 407)。核心技巧:整除/取模拆解數字、立方運算、邊界 100~999。擴展至 n 位需用 Math.pow 或查表優化。

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