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

C 語言練習:水仙花數(三位數自冪數)查找與輸出

     編輯:關於C語言

C 語言練習:水仙花數(三位數自冪數)查找與輸出

水仙花數指三位數,其各位數字立方和等於該數本身(如 153 = 1³+5³+3³)。本文提供遍歷 100~999、拆解數位、判斷立方和的標準 C 實現,並拓展至 N 位數自冪數(阿姆斯壯數)通用解法。

題目大意

  • 輸出所有三位水仙花數(100~999 滿足條件的數)。
  • 定義:`abc = a³ + b³ + c³`,其中 `a` 百位、`b` 十位、`c` 個位。

核心邏輯:數位拆解

int a = i / 100;       // 百位
int b = i / 10 % 10;   // 十位
int c = i % 10;        // 個位
if (a*a*a + b*b*b + c*c*c == i) // 是水仙花數

C 語言完整代碼

#include 

int main() {
    printf("三位水仙花數:\n");
    for (int i = 100; i < 1000; i++) {
        int a = i / 100;
        int b = i / 10 % 10;
        int c = i % 10;
        if (a*a*a + b*b*b + c*c*c == i) {
            printf("%d ", i);
        }
    }
    printf("\n");
    return 0;
}

運行結果

三位水仙花數:
153 370 371 407

共 4 個:153, 370, 371, 407。

擴展:N 位阿姆斯壯數通用解法

定義:N 位數等於其各位數字 N 次方和。
通用判斷函數:

bool is_armstrong(int x) {
    int orig = x;
    int digits = 0;
    int temp = x;
    while (temp) { digits++; temp /= 10; } // 計算位數
    int sum = 0;
    temp = x;
    while (temp) {
        int d = temp % 10;
        int p = 1;
        for (int i = 0; i < digits; i++) p *= d; // d^digits
        sum += p;
        temp /= 10;
    }
    return sum == orig;
}

已知阿姆斯壯數(十進制):1~9 (1位)、153/370/371/407 (3位)、1634/8208/9474 (4位)、54748/92727/93084 (5位)、548834 (6位)... 共 88 個,最大 39 位。

優化技巧:預計算冪次表

int pow10[10]; // 0^3..9^3
for (int d = 0; d < 10; d++) pow10[d] = d*d*d;
// 判斷時直接查表
if (pow10[a] + pow10[b] + pow10[c] == i)

避免重複乘法,對批量判斷顯著加速。

數學冷知識

  • 「水仙花數」名稱源於數字像水仙花一樣「自戀」(自冪)。
  • 無兩位水仙花數(最大 9²+9²=162 < 10)。
  • 四位自冪數稱「四葉玫瑰數」,如 1634 = 1⁴+6⁴+3⁴+4⁴。

總結

水仙花數是「數位拆解 + 次方累加 + 比較」的經典入門練習。掌握 `/100`、`/10%10`、`%10` 拆解百十個位,以及預計算冪次表優化,即可輕鬆解決各類數位運算問題。擴展至 N 位阿姆斯壯數,進一步鍛鍊位數計算、循環冪次累加等通用技能。

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