求出「和」的各位數字計數,與生成該「和」的數字組合計數比較,一致即為水仙花數。
例: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() 入口。測試通過,邏輯閉環完整。