题目:输入6个数,前五个数可以使用加减乘除和括号组成一个表达式,表达式的值要等于第6个数,求出所有表达式的组合。(注: 不能使用stl库)。
下面是c++的解题方法:使用回溯算法来生成所有可能的表达式组合,并逐个验证是否满足条件
#include <iostream>
#include <vector>
#include <string>
#include <cmath>
using namespace std;
class Solution {
public:
void findExpressions(vector<int>& nums, int target) {
string operators = "+-*/";
vector<string> result;
string expr;
backtrack(nums, target, 1, expr, result, nums[0]);
// 输出结果
for (auto& r : result) {
cout << r << endl;
}
}
private:
void backtrack(vector<int>& nums, int target, int index, string& expr, vector<string>& result, int currentValue) {
if (index == nums.size()) {
if (currentValue == target) {
result.push_back(expr);
}
return;
}
string originalExpr = expr;
int originalValue = currentValue;
for (char op : "+-*/") {
if (index != 1) { // 添加运算符
expr += op;
}
expr += to_string(nums[index]);
switch (op) {
case '+': currentValue = originalValue + nums[index]; break;
case '-': currentValue = originalValue - nums[index]; break;
case '*': currentValue = originalValue * nums[index]; break;
case '/':
if (nums[index] != 0 && originalValue % nums[index] == 0) {
currentValue = originalValue / nums[index];
} else {
expr = originalExpr;
continue;
}
break;
}
backtrack(nums, target, index + 1, expr, result, currentValue);
expr = originalExpr;
currentValue = originalValue;
}
}
// 辅助函数,将整数转换为字符串
string to_string(int num) {
string str;
bool isNegative = false;
if (num < 0) {
isNegative = true;
num = -num;
}
do {
str.insert(str.begin(), '0' + (num % 10));
num /= 10;
} while (num > 0);
if (isNegative) {
str.insert(str.begin(), '-');
}
return str;
}
};
int main() {
vector<int> nums = {1, 2, 3, 4, 5, 15}; // 示例输入
int target = nums.back();
nums.pop_back(); // 移除目标值,只保留前五个数
Solution sol;
sol.findExpressions(nums, target);
return 0;
}