题目背景
NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一元一次方程的功能。实验室将这个任务交给了一个刚进入的新手ZL先生。
题目描述
为了很好的完成这个任务,ZL先生首先研究了一些一元一次方程的实例:
4+3x=8
6a-5+1=2-2a
-5+12y=0
ZL先生被主管告之,在计算器上键入的一个一元一次方程中,只包含整数、小写字母及+、-、=这三个数学符号(当然,符号“-”既可作减号,也可作负号)。方程中并没有括号,也没有除号,方程中的字母表示未知数。
你可假设对键入的方程的正确性的判断是由另一个程序员在做,或者说可认为键入的一元一次方程均为合法的,且有唯一实数解。
输入格式
一个一元一次方程。
输出格式
解方程的结果(精确至小数点后三位)。
解题思路
这题是在我写P1021的过程中顺手做的,但还是WA了一次,有两个坑,一个坑是编程中0*(-1)=-0,但是输出结果必须为0,还有一个就是有的未知数前面是没有系数的。注意这两点就可以轻松过。
Talking is cheap,show you my code.
代码
#include<iostream>
#include<string>
#include <iomanip>
using namespace std;
string str;
double k = 0;
double b = 0;
bool flag = 0;
bool ysf = 0;
char name;
int main() {
cin >> str;
int size = str.size();
int t = 0;
for (int i = 0;i < size;i++) {
char c = str[i];
if (c == '+') {
ysf = 0;
}
else {
if (c == '-') {
ysf = 1;
}
else {
if (c == '=') {
flag = 1;
ysf = 0;
}
else {
if (c >= 'a'&&c <= 'z') {
name = c;
if ((i == 0) || (str[i - 1] < '0') || (str[i - 1] > '9')) {
k++;
}
}
else {
if (c >= '0'&&c <= '9') {
t *= 10;
int it = c - '0';
t += it;
if (((i + 1) == size) || (str[i + 1] == '+') || (str[i + 1] == '-') || (str[i + 1] == '=')) {
if (ysf == flag) {
b += t;
t = 0;
}
else {
b -= t;
t = 0;
}
}
else {
if (str[i + 1] >= 'a'&&str[i + 1] <= 'z') {
if (ysf == flag) {
k += t;
t = 0;
}
else {
k -= t;
t = 0;
}
}
}
}
}
}
}
}
}
double ans = b / k;
if (ans) {
ans *= -1;
}
cout << name << "=" <<setprecision(3) << fixed << ans << endl;
return 0;
}