题解:P14305 【MX-J27-T2】转换
no_response · · 题解
题目传送门
思路
大模拟,分三步即可。
去 \texttt , 运算符
这一步很简单,因为
去 \texttt * 运算符
先做一步预处理,把符号和类型区分开来。注意要保存一下每一个
因为符号数量是类型数量减一,所以直接存储
接下来,为了去除
因为刚才存储了
注意:原本是由
去 \texttt + 运算符
这时候,序列中的所有类型都由
AC CDOE
#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;
}