給定 4 個整數,各用一次,任意使用 + - * / ( ) 構造表達式,結果為 24。經典窮舉求解問題。
括號優先序隱含於遞迴順序中,輸出時再根據運算子優先序加括號。
fabs(a-24) < 1e-6。
class Expression {
// 封裝數值與字串表示
double value;
std::string expr;
public:
Expression(double v, const std::string& s) : value(v), expr(s) {}
// 運算子多載自然表達運算邏輯
friend Expression operator+(const Expression& a, const Expression& b) {
return Expression(a.value + b.value, "(" + a.expr + "+" + b.expr + ")");
}
// ... -, *, / 同理
bool is24() const { return std::fabs(value - 24.0) < 1e-6; }
std::string toString() const { return expr; }
};
class Solver {
std::vector nums;
std::vector solutions;
void dfs() { /* 遞迴窮舉 */ }
public:
std::vector solve(const std::vector& input) { /* ... */ }
};
OO 優勢:
• 數值與表達式字串封裝為單一物件,避免平行陣列同步錯誤。
• 運算子多載使運算邏輯與字串構建原子化、不可分割。
• Solver 類別封裝狀態與演算法,介面乾淨,易測試、易擴充 (如支援更多運算子)。