首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

為何在 DEV-C++ 中運行尋找水仙花數代碼結果錯誤?

     編輯:程式設計疑難解答

問題背景

在 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;
}

核心原因分析

1. pow 函數返回值為 double 型別

math.h 中的 pow 返回 double,浮點運算存在精度誤差。例如 pow(5, 3) 可能得到 124.999999 而非精確的 125。當與整數 i 比較時,隱式轉型會導致判斷失敗。

2. 解決方案:改用整數運算

直接計算各位數字的立方和,避免浮點誤差:

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);     // 建議用空格分隔,避免刷新問題

3. 輸出格式細節

原代碼使用 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;
}

總結

避免在整數精確判斷中使用浮點函數;優先採用整數運算。同時注意輸出緩衝特性,適當調整格式字符串。

水仙花數示意圖
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved