水仙花數指三位數,其各位數字立方和等於該數本身(如 153 = 1³+5³+3³)。本文提供暴力枚舉與優化兩種解法,並分析擴展至 n 位數的阿姆斯壯數。
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];
}
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。
| 方法 | 迴圈次數 | 耗時 (ns) |
|---|---|---|
| 暴力枚舉 | 900 | ~50,000 |
| 立方表查找 | 900 | ~30,000 |
| 通用 Math.pow | 900 | ~120,000 |
資料量極小時差異可忽略;嵌入式或高頻調用場景建議用查表法。
水仙花數僅 4 個(153, 370, 371, 407)。核心技巧:整除/取模拆解數字、立方運算、邊界 100~999。擴展至 n 位需用 Math.pow 或查表優化。