洛谷 P1022 计算器的改良
题外话
听说小伙伴们有人作弊?!!
正文
题面
解一元一次方程。(逃
思路
想想七上学的那些方法!
- 去分母(这个不用)
- 去括号(这个不用)
- 移项,合并同类项
- 系数化为 。
模拟呗!
首先,怎么存呢?
开一个叫做 的结构体,有两个参数 和 为系数, 为次数。
最终结果要两个 ,一个常数的,一个未知数的。
遍历整个字符串:
- 遇到
+
或-
,把原先的东西更新到对应的地方(初始是 ,后面变成 ),负数处理一下! - 遇到数字,处理这整个数字。
- 遇到字母,把未知数的
flag
标记一下。 - 遇到等号,前面对应的地方肯定是 ,现在变 。注意要把原先的东西更新一遍。
- 接下来大概就没情况了。
注意! 开始时是未知数的话,数字没有更新,得先置 才行!
处理完输入之后:
遍历等号左边的 :
如果是常数(),则常数项的减去它。
如果是未知数(),则未知数项的加上它。
右边类似,但是是反过来的,常数项加,未知数减。
最后常数项除以未知数项即可。
要格外注意 。(可以用sprintf
弄到char
数组里,再跟 比对)
我的独家 Debug 方法
其实讲了思路就有 90 % 的问题能解决了,
所以:
- 考场上没人让你讲对吧?那自己给自己讲一遍!
- 怕讲了被判作弊?在代码里加注释总不会被抓吧!
代码
#include <bits/stdc++.h>
using namespace std;
struct term {
int base;
bool exp;
term(int b = 0, int e = 0) : base(b), exp(e) {}
};
vector<term> l;
vector<term> r;
int main() {
string s;
cin >> s;
int num = (s[0] != '+' && s[0] != '-');
bool lr = false;
bool neg = false;
bool ukn = false;
char ukn_ltr;
s.push_back('+');
for (int i = 0; i < s.size(); i++) {
if (s[i] == '+' || s[i] == '-' || s[i] == '=') {
if (neg) {
if (!lr) {
l.push_back(term(-num, ukn));
} else {
r.push_back(term(-num, ukn));
}
} else {
if (!lr) {
l.push_back(term(num, ukn));
} else {
r.push_back(term(num, ukn));
}
}
num = 0;
lr |= (s[i] == '=');
neg = (s[i] == '-');
ukn = false;
} else if ('a' <= s[i] && s[i] <= 'z') {
ukn = true;
ukn_ltr = s[i];
} else if ('0' <= s[i] && s[i] <= '9') {
num = 0;
while ('0' <= s[i] && s[i] <= '9') {
num = num * 10 + (s[i] - '0');
i++;
}
i--;
}
}
term constants = term(0, 0);
term unknowns = term(0, 1);
for (int i = 0; i < l.size(); i++) {
if (l[i].exp) {
unknowns.base += l[i].base;
} else {
constants.base -= l[i].base;
}
}
for (int i = 0; i < r.size(); i++) {
if (r[i].exp) {
unknowns.base -= r[i].base;
} else {
constants.base += r[i].base;
}
}
double ans = (double)(constants.base) / (double)(unknowns.base);
char tmp[105];
sprintf(tmp, "%.3lf", ans);
if (strcmp(tmp, "-0.000")) {
printf("%c=%.3lf", ukn_ltr, ans);
} else {
printf("%c=0.000", ukn_ltr);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?