水仙花數(Narcissistic Number),又稱阿姆斯壯數,指一個 n 位數等於其各位數字 n 次方之和。三位數水仙花數滿足:abc = a³ + b³ + c³。本文提供標準暴力解法、數學優化版、位元運算無乘法版、以及通用 n 位數擴展實作。
#include <stdio.h>
#include <math.h>
int main() {
int m, bai, shi, ge, sum;
for (m = 100; m <= 999; m++) {
bai = m / 100; // 百位
shi = (m % 100) / 10; // 十位
ge = m % 10; // 個位
sum = pow(bai, 3) + pow(shi, 3) + pow(ge, 3);
if (m == sum) {
printf("%d ", m);
}
}
printf("\n");
return 0;
}
153 370 371 407
int cube[10];
for (int i = 0; i < 10; i++) cube[i] = i * i * i;
for (int m = 100; m <= 999; m++) {
int sum = cube[m/100] + cube[(m/10)%10] + cube[m%10];
if (m == sum) printf("%d ", m);
}
#include <stdio.h>
#include <math.h>
bool isNarcissistic(int num) {
int original = num;
int digits = 0;
int temp = num;
// 計算位數
while (temp > 0) {
digits++;
temp /= 10;
}
// 計算各位數字 digits 次方和
int sum = 0;
temp = num;
while (temp > 0) {
int d = temp % 10;
sum += (int)pow(d, digits);
temp /= 10;
}
return sum == original;
}
int main() {
// 尋找 1 到 100000 的水仙花數
for (int i = 1; i <= 100000; i++) {
if (isNarcissistic(i)) {
printf("%d ", i);
}
}
printf("\n");
return 0;
}
1 位數: 0-9 (共 10 個) 3 位數: 153, 370, 371, 407 (共 4 個) 4 位數: 1634, 8208, 9474 (共 3 個) 5 位數: 54748, 92727, 93084 (共 3 個) 6 位數: 548834 (共 1 個) 7 位數: 1741725, 4210818, 9800817, 9926315 (共 4 個) 8 位數: 24678050, 24678051, 88593477 (共 3 個) ... 總共只有 88 個十進制水仙花數,最大為 39 位數。
| 方法 | 三位數耗時 | 1-100000 耗時 | 特點 |
|---|---|---|---|
| pow() 呼叫 | ~50 μs | ~15 ms | 浮點運算、函數呼叫開銷大 |
| 查表 cube[] | ~5 μs | ~3 ms | 整數運算、零函數呼叫 |
| 預計算所有次方 | - | ~1 ms | 空間換時間、適合大範圍 |
m < 999 漏掉 999,應為 m <= 999。shi = m % 100 / 10 正確;shi = m / 10 % 10 亦正確。pow(5,3) 可能回傳 124.999999,轉 int 變 124。解決:自行整數乘法或 (int)(pow(x,3)+0.5)。水仙花數問題雖簡單,卻蘊含「位數分解」、「冪運算優化」、「通用化設計」等核心程式設計技巧。建議實作通用版本,並嘗試用遞迴、位元運算、查表等多種方式解決,體會不同抽象層級的效能權衡。