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;
}

posted @ 2025-07-17 09:25  Tobaa  阅读(4)  评论(0)    收藏  举报