题目描述:
提取字符串中的最长合法简单数学表达式,字符串长度最长的,并计算表达式的值。如果没有,则返回 0 。
简单数学表达式只能包含以下内容:
0-9数字,符号+-*
说明:
1、所有数字,计算结果都不超过long
2、如果有多个长度一样的,请返回第一个表达式的结果
3、数学表达式,必须是最长的,合法的
4、操作符不能连续出现,如 +--+1 是不合法的
输入描述:
字符串
输出描述:
表达式值
示例1:
输入
1-2abcd
输出
-1
说明:最长合法简单数学表达式是"1-2",结果是 -1
C++源码:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
long long calculateExpression(const string& expr) {
long long result = 0, num = 0, result_1=1,num_1=1;
char op = '+'; // 初始化操作符为加,表示开始的新数字应累加到结果上
for (char ch : expr) {
if (isdigit(ch)) {
num = num * 10 + (ch - '0'); // 构建当前数字
num_1 = num_1 * 10 + (ch - '0'); // 构建当前数字
}
else if (ch == '+' || ch == '-') {
// 遇到操作符,根据前一个操作符处理num,并重置num为0准备下一个数字
if (op == '+') result += num;
else if (op == '-') result -= num;
else if (op == '*') result_1 *= num_1;
num = 0;
num_1 = 1;
op = ch; // 更新操作符
}
else {
// 如果遇到非数字非指定操作符,表达式不合法,返回0
return 0;
}
}
// 处理最后一个数字(确保在没有结束操作符的情况下也能正确累加/减去)
if (op == '+') {
result += num;
return result;
}
else if (op == '-') {
result -= num;
return result;
}
else if (op == '*') {
result_1 *= num_1;
return result_1;
}
}
int main() {
string str;
getline(cin, str); // 读取输入的字符串
size_t maxLen = 0;
long long ans = 0;
for (size_t i = 0; i < str.size(); ++i) {
for (size_t j = i + 1; j <= str.size(); ++j) {
string subStr = str.substr(i, j - i);
if (subStr.find_first_not_of("0123456789+-") == string::npos) { // 确保子串只包含允许的字符
long long tempResult = calculateExpression(subStr);
if (subStr.size() > maxLen) {
maxLen = subStr.size();
ans = tempResult;
}
}
}
}
cout << ans << endl;
system("pause");
return 0;
}