支持小数的一元一次方程c++解法(有注释)
查看原帖
支持小数的一元一次方程c++解法(有注释)
567847
yxpxa楼主2021/10/16 23:30

不含括号和除法,至少降低了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;
}
2021/10/16 23:30
加载中...