题意:给了一个式子,问你是否存在一个r进制 2<=r<=16 使得式子成立。
思路:字符串长度只有一个等号和运算符,字符串长度最多十五,15-2=13
,假设两个数极小,只占据一个字符,那么剩下一个数的长度就是13-2=11,最大为16进制,一个16进制长度是四位的2进制,也就是最多是2^44 不会炸long long.
那么直接处理出来 a 运算符 b = c
把a、运算符、b、c都搞出来,然后进行2到16进制枚举,把a、b、c都转换为10进制去计算是不是满足算式即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int q[130];
int NO;
ll check(string a,int k){
ll ans=0;
for(auto it: a){
int z=q[it];
if(z>=k ) {
NO=1;return 0;
}
ans=ans*k+z;
}
return ans;
}
int main(){
for(int i=0;i<=15;i++){
if(i<=9) q[i+'0']=i;
else q['A'+i-10]=i;
}
string s;
ios::sync_with_stdio(0);
while(cin>>s){
string a,b,c;
char k='~';
for(int i=0;s[i];i++){
if(s[i]=='='){
c=s.substr(i+1,s.size()-i-1);
break;
}
if(s[i]=='+' || s[i]=='-' || s[i]=='*' || s[i]=='/'){
k=s[i];continue;
}
if(k=='~') a+=s[i];
else b+=s[i];
}
int flag=0;
for(int i=2;i<=16;i++){
NO=0;
ll aa=check(a,i),bb=check(b,i);
ll cc=check(c,i);
if(NO) continue;
if(k=='/'){
if(aa%bb==0 && aa/bb==cc){
cout<<i<<endl;
flag=1;
break;
}
}
if(k=='+' && aa+bb==cc) {
cout<<i<<endl;
flag=1;
break;
}
if(k=='*' && aa*bb==cc) {
cout<<i<<endl;
flag=1;
break;
}
if(k=='-' && aa-bb==cc) {
cout<<i<<endl;
flag=1;
break;
}
}
if(!flag) cout<<"-1"<<endl;
}
return 0;
}