題目:算法
給定任意4個正整數,利⽤用加,減,乘,除,括號這⼏幾個運算符,編程計
算全部由這4個數字計算出24的表達式,並輸出計算表達式。
輸出結果要求:加法,乘法須要去重,(( a + b ) * c) / d = 24 和 (( b + a)
* c ) / d = 24 視爲同⼀一表達式,只輸出任意⼀一個便可。
要求:請嘗試⽤用測試驅動開發程序完成(TDD)
⽰示例1:
輸⼊入:3 3 6 6
輸出:((6/3)+6)*3 = 24
⽰示例2:
輸⼊入:3 2 3 4
輸出:⽆無解
⽰示例3:
輸⼊入:5 5 6 6
輸出:
((5+5)-6)*6 = 24
(5*5)-(6/6) = 24
((5-6)+5)*6 = 24
(5-(6-5))*6 = 24
(6-(6/5))*5 = 24編程
分析:app
既然是TDD開發,那麼先分析數據輸出格式,4個數字,始終有2對括號,在這裏並無四則運算的優先級,都是用括號來表示運算順序,由於4個數字要運算三次,因此2對括號就能完成,因此咱們能夠編寫出一下算術表達式計算函數函數
class Opt { public: string type; int data = 0; }; bool isOpt(string c) { if (c == "+")return true; else if (c == "-")return true; else if (c == "*")return true; else if (c == "/")return true; else if (c == "(")return true; else if (c == ")")return true; else if (c == " ")return true; return false; } int cal(std::stack<Opt> & _s) { if (_s.size() < 3)return 0; Opt op3 = _s.top(); _s.pop(); Opt op2 = _s.top(); _s.pop(); Opt op1 = _s.top(); _s.pop(); if (!_s.empty())_s.pop(); int res = 0; string c = op2.type; if (c == "+") { res = op1.data + op3.data; } else if (c == "-") { res = op1.data - op3.data; } else if (c == "*") { res = op1.data * op3.data; } else if (c == "/") { res = op1.data / op3.data; } return res; } int ParseExp(string exp) { exp.append(" "); std::stack<Opt> _s; int isNum = 0; string nums; for (int i = 0; i < exp.size(); i++) { string opt; opt.push_back(exp[i]); //cout << opt << endl; if (isOpt(opt)) { if (isNum != 0) { int num = 0; for (int k = 0, exp = 1; k < isNum; exp *= 10, k++) { Opt s = _s.top(); num += exp* std::stoi(s.type); _s.pop(); } Opt op; op.data = num; _s.push(op); isNum = 0; } if (opt == ")") { Opt op; op.data = cal(_s); _s.push(op); } else { Opt op; op.type = opt; _s.push(op); } } else { ++isNum; Opt op; op.type = opt; _s.push(op); } } _s.pop(); return cal(_s); } int main() { //int a = 3, b = 3, c = 6, d = 6; //string exp = "((5+5)-6)*6 "; cout << ParseExp("((6/3)+6)*3") << endl;; cout << ParseExp("((5+5)-6)*6") << endl;; cout << ParseExp("(5*5)-(6/6)") << endl;; cout << ParseExp("((55-55)+55)*1") << endl;; system("pause"); return 0; }
輸出 24 24 24 55 ,計算結果正確測試
接下來咱們就該生成全部組合 暴力算法 剪枝不可能的狀況,不貼也罷(1.7 s左右)spa