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;
}