#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <cmath>
using namespace std;
// 浮点数比较精度
const double EPS = 1e-6;
// 判断两个浮点数是否相等
bool equals(double a, double b) {
return fabs(a - b) < EPS;
}
// 递归计算所有可能的表达式
void calculate(vector<double>& nums, vector<string>& exprs, set<string>& results) {
if (nums.size() == 1) {
// 如果结果等于24,添加到结果集
if (equals(nums[0], 24.0)) {
results.insert(exprs[0]);
}
return;
}
// 尝试所有可能的两个数的组合
for (int i = 0; i < nums.size(); ++i) {
for (int j = i + 1; j < nums.size(); ++j) { // 只考虑i < j的情况,避免重复计算
// 取出两个数
double a = nums[i];
double b = nums[j];
string expr_a = exprs[i];
string expr_b = exprs[j];
// 创建新的数字和表达式列表(排除已使用的两个数)
vector<double> new_nums;
vector<string> new_exprs;
for (int k = 0; k < nums.size(); ++k) {
if (k != i && k != j) {
new_nums.push_back(nums[k]);
new_exprs.push_back(exprs[k]);
}
}
// 加法 (满足交换律,只计算一次)
new_nums.push_back(a + b);
new_exprs.push_back("(" + expr_a + " + " + expr_b + ")");
calculate(new_nums, new_exprs, results);
new_nums.pop_back();
new_exprs.pop_back();
// 减法 (不满足交换律,计算两种情况)
new_nums.push_back(a - b);
new_exprs.push_back("(" + expr_a + " - " + expr_b + ")");
calculate(new_nums, new_exprs, results);
new_nums.pop_back();
new_exprs.pop_back();
new_nums.push_back(b - a);
new_exprs.push_back("(" + expr_b + " - " + expr_a + ")");
calculate(new_nums, new_exprs, results);
new_nums.pop_back();
new_exprs.pop_back();
// 乘法 (满足交换律,只计算一次)
new_nums.push_back(a * b);
new_exprs.push_back("(" + expr_a + " * " + expr_b + ")");
calculate(new_nums, new_exprs, results);
new_nums.pop_back();
new_exprs.pop_back();
// 除法 (不满足交换律,计算两种情况,避免除以0)
if (!equals(b, 0.0)) {
new_nums.push_back(a / b);
new_exprs.push_back("(" + expr_a + " / " + expr_b + ")");
calculate(new_nums, new_exprs, results);
new_nums.pop_back();
new_exprs.pop_back();
}
if (!equals(a, 0.0)) {
new_nums.push_back(b / a);
new_exprs.push_back("(" + expr_b + " / " + expr_a + ")");
calculate(new_nums, new_exprs, results);
new_nums.pop_back();
new_exprs.pop_back();
}
}
}
}
// 处理结果,移除最外层括号
vector<string> processResults(set<string>& results) {
vector<string> res;
for (const string& s : results) {
if (s.front() == '(' && s.back() == ')') {
res.push_back(s.substr(1, s.size() - 2));
} else {
res.push_back(s);
}
}
return res;
}
int main() {
// 读取4个输入数字
int nums[4];
for (int i = 0; i < 4; ++i) {
cin >> nums[i];
// 检查输入是否为小于20的正整数
if (nums[i] <= 0 || nums[i] >= 20) {
cerr << "输入必须是小于20的正整数" << endl;
return 1;
}
}
// 初始化数字和表达式列表
vector<double> num_vec;
vector<string> expr_vec;
for (int i = 0; i < 4; ++i) {
num_vec.push_back(double(nums[i]));
expr_vec.push_back(to_string(nums[i]));
}
// 存储所有有效的表达式
set<string> results;
// 计算所有可能的表达式
calculate(num_vec, expr_vec, results);
// 处理结果
vector<string> final_results = processResults(results);
// 输出结果
if (final_results.empty()) {
cout << "No solution" << endl;
} else {
for (const string& s : final_results) {
cout << s << endl;
}
}
return 0;
}