水仙花數(Narcissistic Number)指三位數其各位數字立方和等於該數本身,如 153 = 1³+5³+3³。初學者編寫查找程序時,常因判斷條件寫錯導致無輸出。
原代碼片段(圖片中):
if (n == i*i*i + j*j*j + k*k*k) // 假設 n 是組合數,i,j,k 是百十個位
但實際代碼中可能將變量賦值邏輯寫反,或判斷條件倒置。最佳回答指出:應確保判斷條件為 if (n == i*i*i + j*j*j + k*k*k),其中 n = 100*i + 10*j + k。
#include <stdio.h>
int main() {
int i, j, k, n;
printf("三位數水仙花數有:\n");
for (i = 1; i <= 9; i++) { // 百位 1-9
for (j = 0; j <= 9; j++) { // 十位 0-9
for (k = 0; k <= 9; k++) { // 個位 0-9
n = 100*i + 10*j + k;
if (n == i*i*i + j*j*j + k*k*k) {
printf("%d ", n);
}
}
}
}
printf("\n");
return 0;
}
三位數水仙花數有:
153 370 371 407
#include <stdio.h>
#include <math.h>
int is_narcissistic(int num) {
int original = num, sum = 0, digits = 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 以內水仙花數:\n");
for (int i = 1; i < 10000; i++)
if (is_narcissistic(i)) printf("%d ", i);
printf("\n");
return 0;
}
if (i*i*i+... == n) 雖邏輯等價,但易混淆變量含義。^ 是位異或,立方必須用 i*i*i 或 pow(i,3)(需 math.h 並鏈接 -lm)。n 在循環內未重新計算。if 前加 printf("n=%d, sum=%d\n", n, i*i*i+j*j*j+k*k*k); 觀察中間值。水仙花數是經典的數位拆分與枚舉練習。關鍵在於正確拆解數位、準確計算冪和、嚴謹比較。遇到無輸出先檢查判斷條件與循環邊界,善用打印調試定位問題。