专栏文章
题解:P14305 【MX-J27-T2】转换
P14305题解参与者 3已保存评论 3
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mini9bo8
- 此快照首次捕获于
- 2025/12/02 02:51 3 个月前
- 此快照最后确认于
- 2025/12/02 02:51 3 个月前
题目传送门
思路
大模拟,分三步即可。
去 运算符
这一步很简单,因为 优先级最低,所以答案只要取最后一个逗号右边的表达式的值就可以了。
去 运算符
先做一步预处理,把符号和类型区分开来。注意要保存一下每一个 的位置。
因为符号数量是类型数量减一,所以直接存储 在符号中的下标即可。
因为符号数量是类型数量减一,所以直接存储 在符号中的下标即可。
接下来,为了去除 ,显然要计算,通过题意,推导出 。就可以写出计算函数了,而且运算不分 。
因为刚才存储了 的位置,把第 个 下标记作 ,则去除这个 应当计算第 和 的运算值。
注意:原本是由 连接的类型也应保留。
去 运算符
这时候,序列中的所有类型都由 连接,只需要把每个数都计算一遍,输出答案即可。
AC CDOE
CPP#include <bits/stdc++.h>
using namespace std;
string add_mul(string a, string b) { //计算
if (a == "double" || b == "double") {
return "double";
}
if (a == "float" || b == "float") {
return "float";
}
if (a == "longlong" || b == "longlong") {
return "longlong";
}
return "int";
}
int main() {
int c, t;
cin >> c >> t;
while (t--) {
string s;
cin >> s;
string k = "";
for (int i = 0; i < s.size(); i++) { //去除 ,
if (s[i] == ',') {
k = "";
continue;
}
k += s[i];
}
vector <int> mul;
vector <string> a;
string tmp = "";
int cnt = 0;
for (int i = 0; i < k.size(); i++) { //分离符号和类型
if (k[i] == '+' || k[i] == '*') {
a.push_back(tmp);
tmp = "";
if (k[i] == '*') {
mul.push_back(cnt); //只用保留 * 的位置,其余的默认为 +
}
cnt++;
} else {
tmp += k[i];
}
}
a.push_back(tmp);
vector <string> b;
int start = 0;
for (int i = 0; i < mul.size(); i++) { //去除 *
for (int j = start; j < mul[i]; j++) { //把不用计算的存起来
b.push_back(a[j]);
}
start = mul[i] + 2; //记得下标
b.push_back(add_mul(a[mul[i]], a[mul[i] + 1]));
}
for (int i = start; i < a.size(); i++) {
b.push_back(a[i]);
}
string ans = b[0];
for (int i = 1; i < b.size(); i++) {
ans = add_mul(ans, b[i]); //计算最终答案
}
cout << ans << endl;
}
return 0;
}
相关推荐
评论
共 3 条评论,欢迎与作者交流。
正在加载评论...