2020 Multi-University Training Little Rabbit's Equation 思维,简单模拟

2020 Multi-University Training Little Rabbit's Equation

题目大意:

给你一个字符串,形式是:数字,操作,数字,=,数字。

这个操作包括:+,-,*,/

保证字符串没有空格、没有负号、没有小数点,问这个数字是什么进制满足等式,如果有多个,输出最小的进制,没有则输出-1。

题解:

直接模拟,有一个我觉得比较坑的点就是要判断一下 (A-F) 和字符串中的数字和进制比较大小,如果比进制大肯定是不对的。

#include <bits/stdc++.h>
#define debug(x) cout<<"debug:"<<#x<<" = "<<x<<endl;
using namespace std;
typedef long long ll;
const int maxn = 5e3+10;
char s[20];
string a[10];
int main() {
    while (scanf("%s", s + 1) != EOF) {
        int n = strlen(s + 1), now = 0, flag = 0;
        a[0]="", a[1]="", a[2]="", a[3]="";
        for (int i = 1; i <= n; i++) {
            if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '=') now++, a[3] += s[i];
            else a[now] += s[i];
        }
        for (ll base = 2; base <= 16; base++) {
            ll num[3],maxs = 0;
            for (int i = 0; i < 3; i++) {
                num[i] = 0;
                int len = a[i].size();
                for (int j = 0,x; j < len; j++) {
                    if (a[i][j] >= 'A' && a[i][j] <= 'Z') x = 10 + a[i][j] - 'A';
                    else x = a[i][j] - '0';
                    maxs = max(maxs,x*1ll);
                    num[i] = num[i] * base + x;
                }
            }
//            debug(maxs);
            if(maxs>=base) continue;
            if (a[3][0] == '+' && num[0] + num[1] == num[2]) flag = base;
            if (a[3][0] == '-' && num[0] - num[1] == num[2]) flag = base;
            if (a[3][0] == '*' && num[0] * num[1] == num[2]) flag = base;
            if (a[3][0] == '/' && num[0] == num[2] * num[1]) flag = base;
            if (flag) break;
        }
        printf("%d
", flag ? flag : -1);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/EchoZQN/p/13448632.html