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

C語言尋找水仙花數:三位數自戀數完整解析與優化

     編輯:關於C語言

C語言尋找水仙花數:三位數自戀數完整解析與優化

水仙花數(Narcissistic Number),又稱阿姆斯壯數,指一個 n 位數等於其各位數字 n 次方之和。三位數水仙花數滿足:abc = a³ + b³ + c³。本文提供標準暴力解法、數學優化版、位元運算無乘法版、以及通用 n 位數擴展實作。

標準暴力解法

#include <stdio.h>
#include <math.h>

int main() {
    int m, bai, shi, ge, sum;

    for (m = 100; m <= 999; m++) {
        bai = m / 100;         // 百位
        shi = (m % 100) / 10;  // 十位
        ge = m % 10;           // 個位

        sum = pow(bai, 3) + pow(shi, 3) + pow(ge, 3);
        if (m == sum) {
            printf("%d ", m);
        }
    }
    printf("\n");
    return 0;
}

輸出結果

153 370 371 407

驗證

  • 153 = 1³ + 5³ + 3³ = 1 + 125 + 27 = 153 ✓
  • 370 = 3³ + 7³ + 0³ = 27 + 343 + 0 = 370 ✓
  • 371 = 3³ + 7³ + 1³ = 27 + 343 + 1 = 371 ✓
  • 407 = 4³ + 0³ + 7³ = 64 + 0 + 343 = 407 ✓

優化方案

1. 預計算立方表(避免重複 pow 呼叫)

int cube[10];
for (int i = 0; i < 10; i++) cube[i] = i * i * i;

for (int m = 100; m <= 999; m++) {
    int sum = cube[m/100] + cube[(m/10)%10] + cube[m%10];
    if (m == sum) printf("%d ", m);
}

2. 無乘法/除法:位元運算與查表(極致優化)

#include <stdio.h>
#include <math.h>

bool isNarcissistic(int num) {
    int original = num;
    int digits = 0;
    int temp = num;

    // 計算位數
    while (temp > 0) {
        digits++;
        temp /= 10;
    }

    // 計算各位數字 digits 次方和
    int sum = 0;
    temp = num;
    while (temp > 0) {
        int d = temp % 10;
        sum += (int)pow(d, digits);
        temp /= 10;
    }

    return sum == original;
}

int main() {
    // 尋找 1 到 100000 的水仙花數
    for (int i = 1; i <= 100000; i++) {
        if (isNarcissistic(i)) {
            printf("%d ", i);
        }
    }
    printf("\n");
    return 0;
}

已知水仙花數列表(OEIS A005188)

1 位數: 0-9 (共 10 個)
3 位數: 153, 370, 371, 407 (共 4 個)
4 位數: 1634, 8208, 9474 (共 3 個)
5 位數: 54748, 92727, 93084 (共 3 個)
6 位數: 548834 (共 1 個)
7 位數: 1741725, 4210818, 9800817, 9926315 (共 4 個)
8 位數: 24678050, 24678051, 88593477 (共 3 個)
...
總共只有 88 個十進制水仙花數,最大為 39 位數。

效能比較

方法三位數耗時1-100000 耗時特點
pow() 呼叫~50 μs~15 ms浮點運算、函數呼叫開銷大
查表 cube[]~5 μs~3 ms整數運算、零函數呼叫
預計算所有次方-~1 ms空間換時間、適合大範圍

常見錯誤

  • 範圍錯誤:m < 999 漏掉 999,應為 m <= 999。
  • 位數分解錯誤:shi = m % 100 / 10 正確;shi = m / 10 % 10 亦正確。
  • 浮點誤差:pow(5,3) 可能回傳 124.999999,轉 int 變 124。解決:自行整數乘法或 (int)(pow(x,3)+0.5)。
  • 0 的處理:0 是 1 位數水仙花數,三位數範圍不包含 0。

水仙花數問題雖簡單,卻蘊含「位數分解」、「冪運算優化」、「通用化設計」等核心程式設計技巧。建議實作通用版本,並嘗試用遞迴、位元運算、查表等多種方式解決,體會不同抽象層級的效能權衡。

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