1. 程式人生 > 實用技巧 >2020 Multi-University Training Little Rabbit's Equation 思維,簡單模擬

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\n", flag ? flag : -1);
    }
    return 0;
}