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

C語言水仙花數(阿姆斯壯數)查找:常見邏輯錯誤與修正

     編輯:C 語言問答

水仙花數程序無輸出?核心邏輯判斷條件寫反了

水仙花數(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 

擴展:n 位水仙花數通用解法

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

常見錯誤清單

  1. 判斷條件倒置:寫成 if (i*i*i+... == n) 雖邏輯等價,但易混淆變量含義。
  2. 循環範圍錯:百位從 0 開始會輸出 0、1 等非三位數。
  3. 冪運算用 ^:C語言中 ^ 是位異或,立方必須用 i*i*i 或 pow(i,3)(需 math.h 並鏈接 -lm)。
  4. 變量未初始化:n 在循環內未重新計算。

調試技巧

  • 在判斷 if 前加 printf("n=%d, sum=%d\n", n, i*i*i+j*j*j+k*k*k); 觀察中間值。
  • 使用 IDE 斷點單步執行,監視變量變化。

總結

水仙花數是經典的數位拆分與枚舉練習。關鍵在於正確拆解數位、準確計算冪和、嚴謹比較。遇到無輸出先檢查判斷條件與循環邊界,善用打印調試定位問題。

原錯誤代碼截圖
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved