不含括号和除法,至少降低了80%的难度,而且关于方程正确性判断的难度,远远超过解方程
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main() {
int k = 1;
float da = 0, dx = 0;
string s, str;
cin >> str;
smatch re;
regex_search(str, re, regex("[a-z]")); //寻找未知数的小写字母
string x = re.str(0);
//创建正则表达式,识别数字及未知数,如: -2.34, 5.7x, x, 10, -x 等
regex e("[-]?\\d+[.]?\\d*[a-z]?|[-]?[a-z]{1}");
sregex_iterator pos(str.cbegin(), str.cend(), e); //迭代器
sregex_iterator end;
int n = str.find("=", 0); //寻找等号的位置
for (; pos != end; ++pos) {
s = pos->str(); //识别出的第n项
if (pos->position() > n) k = -1; //等号右边的项乘 -1
if (s.find(x, 0) == string::npos) //识别项中不包含未知数,即常数项
da += stof(s) * k * (-1); //常数项移到右侧,乘 -1,并求和
else {
if (s == x) s = "1"; // x的默认系数为 1
if (s == "-" + x) s = "-1"; //-x的默认系数为 -1
dx += stof(s) * k; //未知数系数之和
}
}
cout.setf(ios::fixed);
cout.precision(3); //保留3位有效数字
cout << x + "=" << da / dx;
return 0;
}