杭电多校第六场-1002 Little Rabbit‘s Equation

题目链接 (这里贴的是比赛内的链接,可能需要登多校账号)

题意:给定一个运算表达式,形式上满足 n u m 1   o p   n u m 2 = n u m 3 ( o p ∈ { + , − , ∗ , / } ) num_1 \space op \space num_2=num_3 (op \in \{+,-,*,/\}) num1 op num2=num3(op{+,,,/})问你这个表达式在何种进制下 ( 2 − 16 ) (2-16) 216成立,输出最小的可行进制。
思路:模拟题意就行,处理出表达式的三个运算数,记录其中出现的值最大符号,进制从它加一开始到16遍历就行了,注意0+0=0得输出2进制,以及除法不是整数除,直接判断 n u m 2 ∗ n u m 3 num_2*num_3 num2num3就行了。

#include

using namespace std;
#define ll long long
#define pb push_back
#define rep(i, a, b) for(int i=a;i<=b;i++)
#define frep(i, a, b) for(int i=a;i>=b;i--)
const int maxn = 1E5 + 10;
map<char, int> asc;

int main() {
    //freopen("1.txt","r",stdin);
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int t;
    ll n, k;
    for (int i = 0; i <= 9; i++) asc[(char) (i + '0')] = i;
    for (int i = 0; i < 6; i++) asc[(char) (i + 'A')] = i + 10;
    string str;
    while (cin >> str) {
        string s[3];
        char op;
        int cnt = 0,bas=0,ans=-1,f=0;
        for (auto i:str) {
            if (i == '+' || i == '-' || i == '*' || i == '/' || i == '=') {
                if (i != '=') op = i;
                cnt++;
            } else {
                s[cnt] += i;
                bas=max(bas,asc[i]);
            }
        }
        for(int i=max(bas+1,2);i<=16;i++){
            ll num[3],x;
            //cout<<"i: "<
            for(int j=0;j<3;j++){
                num[j]=0,x=1;
                int len=s[j].size();
                for(int k=len-1;k>=0;k--){
                    num[j]+=asc[s[j][k]]*x;
                    x*=i;
                }
            }
            if(op=='+'){
                if(num[0]+num[1]==num[2]){
                    ans=i;
                    break;
                }
            }
            else if(op=='-'){
                if(num[0]-num[1]==num[2]){
                    ans=i;
                    break;
                }
            }
            else if(op=='*'){
                if(num[0]*num[1]==num[2]){
                    ans=i;
                    break;
                }
            }
            else {
                if(num[0]==num[1]*num[2]){
                    if(num[1]==0) break;
                    ans=i;
                    break;
                }
            }
        }
        cout <<ans<< endl;
    }
    return 0;
}

你可能感兴趣的:(hdu)