水仙花數指三位數等於其各位數字立方和。本文展示三種不同思路的 C 語言實現,幫助理解循環嵌套、數位拆分與模塊化設計。
#include <stdio.h>
int main() {
int a, b, c, n, sum;
printf("水仙花數:");
for (a = 1; a <= 9; a++) { // 百位 1-9
for (b = 0; b <= 9; b++) { // 十位 0-9
for (c = 0; c <= 9; c++) { // 個位 0-9
n = 100*a + 10*b + c;
sum = a*a*a + b*b*b + c*c*c;
if (n == sum) printf("%d ", n);
}
}
}
printf("\n");
return 0;
}
#include <stdio.h>
int main() {
int n, a, b, c;
printf("水仙花數:");
for (n = 100; n <= 999; n++) {
a = n / 100; // 百位
b = (n / 10) % 10; // 十位
c = n % 10; // 個位
if (n == a*a*a + b*b*b + c*c*c)
printf("%d ", n);
}
printf("\n");
return 0;
}
#include <stdio.h>
#include <math.h>
// 判斷任意正整數是否為水仙花數(n 位數各位 n 次方和等於自身)
int is_narcissistic(int num) {
if (num <= 0) return 0;
int original = num, digits = 0, sum = 0;
while (original) { digits++; original /= 10; }
original = num;
while (original) {
int d = original % 10;
sum += pow(d, digits);
original /= 10;
}
return sum == num;
}
int main() {
printf("10000 以內水仙花數:");
for (int i = 1; i < 10000; i++)
if (is_narcissistic(i)) printf("%d ", i);
printf("\n");
return 0;
}
gcc narcissistic.c -o narcissistic -lm // 方法三需鏈接數學庫
./narcissistic
水仙花數:153 370 371 407
10000 以內水仙花數:1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474
/10 取高位,%10 取低位。x*x*x 比 pow(x,3) 更高效且無需鏈接庫。is_narcissistic,主函數只負責遍歷與輸出,符合單一職責原則。三種方法各有優勢:方法一適合初學者理解嵌套循環;方法二代碼緊湊、易擴展到固定位數;方法三體現軟件工程思想,便於復用與測試。建議初學者先掌握前兩種,進階後採用函數封裝風格。