在 DEV-C++ 環境下編譯運行以下尋找三位數水仙花數(Narcissistic Number)的代碼,結果不正確;但提交到藍橋杯練習平台卻顯示通過。
#include <stdio.h>
#include <math.h>
int main() {
int i;
for (i = 100; i < 1000; i++) {
if (i == pow(i % 10, 3) + pow(i / 100, 3) + pow(i / 10 % 10, 3))
printf("%d\n", i);
}
return 0;
}
pow 函數返回值為 double 型別math.h 中的 pow 返回 double,浮點運算存在精度誤差。例如 pow(5, 3) 可能得到 124.999999 而非精確的 125。當與整數 i 比較時,隱式轉型會導致判斷失敗。
直接計算各位數字的立方和,避免浮點誤差:
int a = i / 100; // 百位
int b = (i / 10) % 10; // 十位
int c = i % 10; // 個位
if (i == a*a*a + b*b*b + c*c*c)
printf("%d ", i); // 建議用空格分隔,避免刷新問題
原代碼使用 printf("%d\n", i),某些環境下緩衝區刷新不及時會導致輸出異常。改為 printf("%d ", i) 並在循環結束後輸出換行更穩妥。
#include <stdio.h>
int main() {
int i;
for (i = 100; i < 1000; i++) {
int a = i / 100;
int b = (i / 10) % 10;
int c = i % 10;
if (i == a*a*a + b*b*b + c*c*c)
printf("%d ", i);
}
printf("\n");
return 0;
}
避免在整數精確判斷中使用浮點函數;優先採用整數運算。同時注意輸出緩衝特性,適當調整格式字符串。