水仙花數(Narcissistic Number),又稱阿姆斯壯數,是指一個三位數,其各位數字立方和等於該數本身。即:
abc = a³ + b³ + c³,其中 a ∈ [1,9],b,c ∈ [0,9]。
最直觀的解法是枚舉百位、十位、個位所有組合,驗證立方和條件。
#include <stdio.h>
int main() {
printf("水仙花數有:\n");
for (int i = 1; i <= 9; i++) { // 百位:1-9
for (int j = 0; j <= 9; j++) { // 十位:0-9
for (int k = 0; k <= 9; k++) { // 個位:0-9
int sum_cubes = i*i*i + j*j*j + k*k*k; // 立方和
int number = i*100 + j*10 + k; // 實際數值
if (sum_cubes == number) {
printf("%d ", number);
}
}
}
}
printf("\n");
return 0;
}
水仙花數有: 153 370 371 407
| 數字 | 百位 | 十位 | 個位 | 立方和 | 結果 |
|---|---|---|---|---|---|
| 153 | 1 | 5 | 3 | 1+125+27=153 | ✓ |
| 370 | 3 | 7 | 0 | 27+343+0=370 | ✓ |
| 371 | 3 | 7 | 1 | 27+343+1=371 | ✓ |
| 407 | 4 | 0 | 7 | 64+0+343=407 | ✓ |
int cube[10]; for (int d = 0; d <= 9; d++) cube[d] = d*d*d; // 循環內直接用 cube[i] + cube[j] + cube[k]
// 判斷任意正整數是否為 n 位自戀數
bool is_narcissistic(int num) {
int original = num;
int digits = 0, sum = 0;
int temp = num;
while (temp > 0) { digits++; temp /= 10; }
temp = num;
while (temp > 0) {
int d = temp % 10;
int p = 1;
for (int i = 0; i < digits; i++) p *= d;
sum += p;
temp /= 10;
}
return sum == original;
}
十進位下共有 88 個自戀數,最大為 39 位數:115132219018763992565095597973971522401。
水仙花數是巢狀循環、數位拆解、條件判斷的經典綜合練習,適合初學者鞏固: