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

C語言三重循環求解水仙花數(三位數自戀數)完整實現

     編輯:關於C語言

什麼是水仙花數?

水仙花數(Narcissistic Number),又稱阿姆斯壯數,是指一個三位數,其各位數字立方和等於該數本身。即:

abc = a³ + b³ + c³,其中 a ∈ [1,9],b,c ∈ [0,9]。

暴力枚舉法:三重循環窮舉

最直觀的解法是枚舉百位、十位、個位所有組合,驗證立方和條件。

#include <stdio.h>

int main() {
    printf("水仙花數有:\n");
    
    for (int i = 1; i <= 9; i++) {        // 百位:1-9
        for (int j = 0; j <= 9; j++) {    // 十位:0-9
            for (int k = 0; k <= 9; k++) { // 個位:0-9
                int sum_cubes = i*i*i + j*j*j + k*k*k;  // 立方和
                int number    = i*100 + j*10 + k;       // 實際數值
                
                if (sum_cubes == number) {
                    printf("%d ", number);
                }
            }
        }
    }
    printf("\n");
    return 0;
}

執行結果

水仙花數有:
153 370 371 407 

驗證過程示例

數字百位十位個位立方和結果
1531531+125+27=153✓
37037027+343+0=370✓
37137127+343+1=371✓
40740764+0+343=407✓

複雜度分析

  • 時間複雜度:O(9×10×10) = O(900),常數級,極快
  • 空間複雜度:O(1),僅使用少量變數

優化與擴展思路

1. 預計算立方表(避免重複乘法)

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

// 循環內直接用 cube[i] + cube[j] + cube[k]

2. 推廣至 n 位數(廣義水仙花數)

// 判斷任意正整數是否為 n 位自戀數
bool is_narcissistic(int num) {
    int original = num;
    int digits = 0, sum = 0;
    int temp = num;
    
    while (temp > 0) { digits++; temp /= 10; }
    temp = num;
    while (temp > 0) {
        int d = temp % 10;
        int p = 1;
        for (int i = 0; i < digits; i++) p *= d;
        sum += p;
        temp /= 10;
    }
    return sum == original;
}

3. 已知數學結論

十進位下共有 88 個自戀數,最大為 39 位數:115132219018763992565095597973971522401。

教學價值總結

水仙花數是巢狀循環、數位拆解、條件判斷的經典綜合練習,適合初學者鞏固:

  • 多重循環控制變數範圍
  • 整數拆解數位技巧(/10, %10)
  • 數學問題向程式邏輯的轉化
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved