P1022 计算器的改良 题解
题目简述:
给出一个简单一元一次方程(不含括号和除号)进行求解。
思路:
把方程拆成等号左右的两个整式,计算系数之和常数之和,最后进行相除。
代码:
(依旧史山)
#include <bits/stdc++.h>
using namespace std;
int main() {
bool flag = true;
string s, tmp;
cin >> s;
int len = s.length(), xsz = 0, csz = 0;
if (s[0] >= 'a' && s[0] <= 'z')xsz = 1;
for (int i = 1; i < len; i++) {
string xs;
if (s[i] == '=') flag = false;
if (s[i] >= 'a' && s[i] <= 'z') {
tmp[0] = s[i];
s[i] = '#';
for (int j = i - 1; j >= 0; j--) {
if (s[j] >= '0' && s[j] <= '9') {
xs += s[j];
s[j] = '#';
if (j == 0) {
reverse(xs.begin(), xs.end());
int num = stoi(xs);
xsz += num;
}
} else {
reverse(xs.begin(), xs.end());
int num = 0;
if (xs.size() == 0) num = 1;
else num = stoi(xs);
if (flag == true) {
if (s[j] == '-') xsz -= num;
else xsz += num;
} else {
if (s[j] == '-') xsz += num;
else xsz -= num;
}
break;
}
}
}
}
flag = true;
string cs;
int x;
for (int i = 0; i < len; i++) {
if (s[i] == '=') flag = false;
if (s[i] >= '0' && s[i] <= '9') {
for (int j = i; j < len; j++) {
if (s[j] < '0' || s[j] > '9') break;
cs += s[j];
x = j;
}
if (i == 0) csz -= stoi(cs);
else if (s[i - 1] == '=') csz += stoi(cs);
else if (s[i - 1] == '-' && flag == true) csz += stoi(cs);
else if (s[i - 1] == '-' && flag == false) csz -= stoi(cs);
else if (s[i - 1] == '+' && flag == true) csz -= stoi(cs);
else if (s[i - 1] == '+' && flag == false) csz += stoi(cs);
cs.clear();
i = x, x = 0;
}
}
double a = xsz * 1.0, b = csz * 1.0;
cout << tmp[0] << "=";
if (b / a == 0) printf("%.3f", 0);
else printf("%.3f", b / a);
return 0;
}