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

代碼意識流:水仙花數(花朵數)問題第七彈——驗算邏輯與遞歸生成完整實現

     編輯:關於C語言

驗算核心思想

求出「和」的各位數字計數,與生成該「和」的數字組合計數比較,一致即為水仙花數。
例:5³+3³+1³=153,153 由 1,5,3 組成 → 是。
反例:5³+3³+2³=160,160 由 1,6,0 組成 ≠ 5,3,2 → 否。

關鍵數據結構


typedef unsigned int SHUZI_GESHU[JINZHI]; // SHUZI_GESHU[d] 存數字 d 的個數
typedef DASHU SHUJUBIAO[JINZHI-1][WEISHU+1]; // 預計算冪次表

遞歸生成 + 記錄計數


static void xunhuan(int gssx, int sz, DASHU (*p_hang)[WEISHU+1]) {
    static DASHU he = {{0}};
    static SHUZI_GESHU sz_gs;
    DASHU he_ = he; // 保存遞歸前狀態

    if (sz > 0) {
        for (int i = 0; i <= gssx; i++) {
            sz_gs[sz] = i;                 // 記錄當前數字個數
            ds_jiaru(&he, *p_hang + i);    // 累加冪次
            xunhuan(gssx - i, sz - 1, p_hang + 1); // 遞歸下一數字
            he = he_;                      // 回溯恢復
        }
    } else {
        sz_gs[sz] = gssx;                  // 最後一位數字個數
        #ifdef CESHI
        // 打印組合調試
        #endif
        // 驗算入口
        if (wenhe(&sz_gs, &he) == SHI) {
            // 記錄結果
        }
    }
}

驗算函數 wenhe


static SF wenhe(SHUZI_GESHU *p_sz_gs, const DASHU *p_he) {
    int sz_gs_he[JINZHI] = {0};
    if (chaoguo_W(p_he) == SHI || buzu_W(p_he) == SHI) return FOU; // 位數不符
    qiu_sz_gs(&sz_gs_he, p_he);            // 統計和的各位計數
    if (memcmp(sz_gs_he, *p_sz_gs, sizeof(sz_gs_he)) == 0) return SHI;
    return FOU;
}

輔助模組

  • 常用.h:定義 enum { SHI, FOU } SF; 替代 0/1,提升可讀性。
  • 3_大數.h/.c:大數加法、乘冪、統計位計數、位數判斷。
  • 2_窮舉.h/.c:構建冪次表、遞歸窮舉組合、調用驗算。

編譯單元演進

模塊化拆分:0_問題.h 定義常量,常用.h 通用類型,3_大數.* 大數運算,2_窮舉.* 組合生成與驗算,主程序調用 qiongju() 入口。測試通過,邏輯閉環完整。

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