PS:额外存出这个算式中最大的单个数字,从当前数字+1的进制开始,比如出现A就至少是11进制,否则进制转换的时候会出现问题。 总的代码:
#include<iostream> #include<algorithm> #include<string.h> using namespace std; #define ll long long int a[3][1000]; char ch1; int maxn; int read() { maxn = -1; char ch[1000]; if (scanf(" %s", ch) == EOF)return 0; int len; len = strlen(ch); int cnt = 0; int i = 0; for (; ch[i] != '+' && ch[i] != '-' && ch[i] != '*' && ch[i] != '/'; i++) { if (ch[i] >= 'A')a[0][cnt++] = ch[i] - 'A' + 10; else a[0][cnt++] = ch[i] - '0'; maxn = max(maxn, a[0][cnt - 1]); } ch1 = ch[i++]; a[0][cnt] = -1; cnt = 0; for (; ch[i] != '='; i++) { if (ch[i] >= 'A')a[1][cnt++] = ch[i] - 'A' + 10; else a[1][cnt++] = ch[i] - '0'; maxn = max(maxn, a[1][cnt - 1]); } a[1][cnt] = -1; cnt = 0; i++; for (; i < len; i++) { if (ch[i] >= 'A')a[2][cnt++] = ch[i] - 'A' + 10; else a[2][cnt++] = ch[i] - '0'; maxn = max(maxn, a[2][cnt - 1]); } a[2][cnt] = -1; return 1; } ll tran(int* num, int jin) { ll ans = 0; int cnt = 0; while (num[cnt] != -1) { ans *= jin; ans += num[cnt++]; } return ans; } int main() { while (read()) { ll x, y, z; int flag = 0; for (int i = max(2,maxn+1); i <= 16; i++) { x = tran(a[0], i); y = tran(a[1], i); z = tran(a[2], i); if (ch1 == '+') { if (x + y == z) { cout << i << endl; flag = 1; break; } } else if (ch1 == '-') { if (x - y == z) { cout << i << endl; flag = 1; break; } } else if (ch1 == '*') { if (x * y == z) { cout << i << endl; flag = 1; break; } } else { if (x / y == z && x % y == 0) { cout << i << endl; flag = 1; break; } } } if (!flag)cout << -1 << endl; } return 0; }