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

代碼意識流:花朵數問題(二)— 窮舉策略優化與組合生成

     編輯:關於C語言

窮舉方案演進

方案 1:遍歷所有 W 位數

for (W_ws=最小; W_ws<=最大; W_ws++) 驗算
缺點:需自定大整數型別、實作賦值/加一/比較,且搜索空間高達 9×10²⁰(21 位),不可行。

方案 2:巢狀迴圈枚舉各位數排列

for (d1=1..9) for (d2=0..9) ... for (dW=0..9) 驗算
搜索空間同方案 1,但避免大整數型別。仍太大。

方案 2-1:枚舉「組合」而非「排列」— 關鍵優化

觀察:110 與 101 的各位數 3 次方和相同(1+1+0)。只需驗算非遞增數字組合:

for (d1=9; d1>0; d1--)
  for (d2=d1; d2>=0; d2--)
    ...
      for (dW=dW-1; dW>=0; dW--)
        驗算

搜索空間劇減:21 位十進位僅 C(30,9)-1 = 14,307,149 種組合(約 1.4 千萬),完全可在 3 分鐘內完成。

驗算邏輯

  1. 預計算 pow[d] = d^N (d=0..9)。
  2. 對每個組合,計算 sum = Σ pow[di]。
  3. 檢查 sum 的各位數字組成是否與當前組合一致(排序後比對)。
  4. 一致則記錄 sum 為解。

測試驗證

切換 CESHI 模式(N=3),編譯執行,確認輸出 153、370、371、407 等水仙花數,邏輯正確後再切換 QIUJIE 求解 21 位問題。

感悟

「寫代碼是簡單的,想代碼應該怎麼寫是困難的。用代碼行數衡量程式設計師工作量是愚蠢的。」

本系列展示了從問題分析、搜索空間數學優化、測試先行到模組化實作的完整工程思維。

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