题解:P14305 【MX-J27-T2】转换

· · 题解

题目传送门

思路

大模拟,分三步即可。

\texttt , 运算符

这一步很简单,因为 \texttt , 优先级最低,所以答案只要取最后一个逗号右边的表达式的值就可以了。

\texttt * 运算符

先做一步预处理,把符号和类型区分开来。注意要保存一下每一个 \texttt * 的位置。
因为符号数量是类型数量减一,所以直接存储 \texttt * 在符号中的下标即可。

接下来,为了去除 \texttt *,显然要计算,通过题意,推导出 \texttt {char}, \texttt {bool} < \texttt {int} < \texttt {longlong} < \texttt {float} < \texttt {double}。就可以写出计算函数了,而且运算不分 \texttt +, \texttt *

因为刚才存储了 \texttt * 的位置,把第 i\texttt * 下标记作 mul_i,则去除这个 \texttt * 应当计算第 mul_imul_{i + 1} 的运算值。

注意:原本是由 \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;
}