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

C 語言實現水仙花數:位數拆解與判斷邏輯詳解

     編輯:程式設計疑難解答

什麼是水仙花數?

三位數中,各位數字立方和等於該數本身。例如:$153 = 1^3 + 5^3 + 3^3$。典型水仙花數共有 4 個:153、370、371、407。

核心難點:如何提取百位、十位、個位?

給定三位數 `n`(100~999):

  • 百位:`a = n / 100` (整數除法,如 153/100=1)
  • 十位:`b = (n / 10) % 10` (先去掉個位 153/10=15,再取餘 15%10=5)
  • 個位:`c = n % 10` (直接取餘 153%10=3)

完整代碼實現

#include 
#include 

int is_narcissistic(int n) {
    int a = n / 100;
    int b = (n / 10) % 10;
    int c = n % 10;
    return (a*a*a + b*b*b + c*c*c) == n;
}

int main() {
    printf("水仙花數有:\n");
    for (int i = 100; i < 1000; i++) {
        if (is_narcissistic(i)) {
            printf("%d ", i);
        }
    }
    printf("\n");
    return 0;
}

進階擴展:N 位自戀數

若要求任意位數,需動態提取每位數字:

bool is_narcissistic_general(int n) {
    int original = n;
    int digits[10], len = 0;
    while (n > 0) {
        digits[len++] = n % 10;
        n /= 10;
    }
    long long sum = 0;
    for (int i = 0; i < len; i++) {
        sum += pow(digits[i], len);
    }
    return sum == original;
}

常見錯誤避坑

  • 忘記包含 `` 導致 `pow` 未聲明。
  • `pow` 返回 `double`,隱式轉換可能產生精度誤差(如 5^3=124.9999),建議整數自乘或四捨五入 `(int)(pow(x, n) + 0.5)`。
  • 循環範圍寫錯(如 `i <= 1000` 導致四位數混入)。

總結

水仙花數問題核心考察整數拆位技巧(除 10 取商、模 10 取餘)與循環邊界控制。掌握 `n/100`、`(n/10)%10`、`n%10` 這三個公式,即可輕松解決所有固定位數的數字拆解問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved