水仙花數指三位數,其各位數字立方和等於該數本身(如 153 = 1³+5³+3³)。本文提供遍歷 100~999、拆解數位、判斷立方和的標準 C 實現,並拓展至 N 位數自冪數(阿姆斯壯數)通用解法。
int a = i / 100; // 百位
int b = i / 10 % 10; // 十位
int c = i % 10; // 個位
if (a*a*a + b*b*b + c*c*c == i) // 是水仙花數
#include
int main() {
printf("三位水仙花數:\n");
for (int i = 100; i < 1000; i++) {
int a = i / 100;
int b = i / 10 % 10;
int c = i % 10;
if (a*a*a + b*b*b + c*c*c == i) {
printf("%d ", i);
}
}
printf("\n");
return 0;
}
三位水仙花數:
153 370 371 407
共 4 個:153, 370, 371, 407。
定義:N 位數等於其各位數字 N 次方和。
通用判斷函數:
bool is_armstrong(int x) {
int orig = x;
int digits = 0;
int temp = x;
while (temp) { digits++; temp /= 10; } // 計算位數
int sum = 0;
temp = x;
while (temp) {
int d = temp % 10;
int p = 1;
for (int i = 0; i < digits; i++) p *= d; // d^digits
sum += p;
temp /= 10;
}
return sum == orig;
}
已知阿姆斯壯數(十進制):1~9 (1位)、153/370/371/407 (3位)、1634/8208/9474 (4位)、54748/92727/93084 (5位)、548834 (6位)... 共 88 個,最大 39 位。
int pow10[10]; // 0^3..9^3
for (int d = 0; d < 10; d++) pow10[d] = d*d*d;
// 判斷時直接查表
if (pow10[a] + pow10[b] + pow10[c] == i)
避免重複乘法,對批量判斷顯著加速。
水仙花數是「數位拆解 + 次方累加 + 比較」的經典入門練習。掌握 `/100`、`/10%10`、`%10` 拆解百十個位,以及預計算冪次表優化,即可輕鬆解決各類數位運算問題。擴展至 N 位阿姆斯壯數,進一步鍛鍊位數計算、循環冪次累加等通用技能。