大概阐述一下我的思路:把原始方程的所有项进行拆分,每一个项满足[+|-]num[x]
的形式,即把加减号全部处理为单项的正负号。将方程化为ax+b=0的一般形式后用公式x=−ab求解,在处理单个项时看最后是不是字母,决定系数是加在a还是b上。等号右边的项系数取相反数。
#include <bits/stdc++.h>
using namespace std;
int a, b;
// equa => ax+b=0
bool aftereq = false;
char letter;
void parse(string s) //处理单个项,保证s符合[+|-]?[0-9]+[a-z]?的形式
{
bool sign = true;
int i = 0;
if (s[0] == '-')
{
sign = false;
i = 1;
}
if (s[0] == '+')
i = 1; //处理开头的符号
int num = 0; //系数的绝对值
bool isletter = false; //带未知数项
for (; i < s.size(); i++) //逐个字符扫描
{
if (s[i] >= '0' && s[i] <= '9') //是数字
{
num = num * 10 + s[i] - '0';
}
else //数字扫完了碰到的一定是字母
{
letter = s[i];
isletter = true;
}
}
if (!sign)
num = -num; //加上符号
if (aftereq)
num = -num; //是等号之后的项取相反数
if (isletter) //判断是常数项还是未知数项
a += num;
else
b += num;
}
int main()
{
string equa;
cin >> equa;
int s = 0;
for (int i = 0; i < equa.size(); i++) //处理原方程拆分项
{
if (equa[i] == '+' || equa[i] == '-') //正负号和等号可以看成前一项的结束
{
parse(equa.substr(s, i - s));
s = i;
}
else if (equa[i] == '=')
{
parse(equa.substr(s, i - s));
s = i + 1;
aftereq = true;
}
}
parse(equa.substr(s, equa.size() - s)); //最后一项要处理
printf("%c=%.3f\n", letter, -(b * 1.0) / a);
return 0;
}