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

C 語言數字特徵判斷:水仙花數 (三位數各位立方和等於自身) 的檢測與擴展

     編輯:關於C語言

問題描述

輸入一個三位數 n,判斷是否為水仙花數:各位數字立方和等於該數。如 153 = 1³ + 5³ + 3³。核心考點:位數分解、立方計算、已知結構驗證。

標準實現


#include 

int main() {
    int num;
    printf("輸入三位整數: ");
    scanf("%d", &num);

    if (num < 100 || num > 999) {
        printf("非三位數\n");
        return 1;
    }

    int a = num % 10;        // 個位
    int b = num / 10 % 10;   // 十位
    int c = num / 100;       // 百位

    if (num == a*a*a + b*b*b + c*c*c)
        printf("%d 是水仙花數!\n", num);
    else
        printf("%d 不是水仙花數!\n", num);
    return 0;
}

位數分解通用模式


// 從低位到高位
int digit[10], len = 0;
int temp = num;
while (temp > 0) {
    digit[len++] = temp % 10;
    temp /= 10;
}
// digit[0] 個位, digit[1] 十位, ...

數學背景:三位水仙花數只有 4 個

窮舉 100-999 驗證,僅有:

數字分解驗證
1531³ + 5³ + 3³ = 1 + 125 + 27 = 153
3703³ + 7³ + 0³ = 27 + 343 + 0 = 370
3713³ + 7³ + 1³ = 27 + 343 + 1 = 371
4074³ + 0³ + 7³ = 64 + 0 + 343 = 407

通用化:阿姆斯壯數 (N 位數各位 N 次方和等於自身)


bool is_armstrong(int n) {
    int original = n, digits = 0, sum = 0;
    int temp = n;
    while (temp > 0) { digits++; temp /= 10; }  // 計算位數

    temp = n;
    while (temp > 0) {
        int d = temp % 10;
        int p = 1;
        for (int i = 0; i < digits; i++) p *= d;  // d^digits
        sum += p;
        temp /= 10;
    }
    return sum == original;
}

// 已知阿姆斯壯數 (十進制): 1-9, 153, 370, 371, 407, 1634, 8208, 9474, 54748, 92727, 93084, 548834, ...

優化:預計算冪表


bool is_armstrong_fast(int n) {
    static int pow_cache[10][10] = {0};  // pow_cache[d][k] = d^k
    static bool initialized = false;
    if (!initialized) {
        for (int d = 0; d <= 9; d++) {
            pow_cache[d][0] = 1;
            for (int k = 1; k <= 9; k++) pow_cache[d][k] = pow_cache[d][k-1] * d;
        }
        initialized = true;
    }

    int digits = 0, temp = n;
    while (temp > 0) { digits++; temp /= 10; }

    int sum = 0;
    temp = n;
    while (temp > 0) {
        sum += pow_cache[temp % 10][digits];
        temp /= 10;
    }
    return sum == n;
}

總結

水仙花數是「位數分解、冪運算、有限解集驗證」的經典練習。關鍵收穫:

  • 三位水仙花數**僅 4 個**:153, 370, 371, 407,可直接查表 O(1);
  • 位數分解通用模式:%10 取位,/=10 右移;
  • 通用阿姆斯壯數判斷需動態計算位數與冪;
  • 預計算冪表 pow_cache[10][10] 消除重複冪運算;
  • 輸入驗證 (100-999) 是健壯性基礎。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved